输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回
思路:根据前序遍历找到根,根据中序遍历找到左右子树,依次递归。
public static TreeNode Tree(List<int> preTree, List<int> midTree)
{
if (preTree == null || preTree.Count() == 0 || midTree == null || midTree.Count() == 0)
{
return null;
}
//根节点
int rootTree = preTree[0];
//移除根节点
preTree.RemoveAt(0);
TreeNode treeNode = new TreeNode(rootTree);
//左右子树
List<int> leftTree = null;
List<int> tempList = new List<int>();
bool isTree = false;
foreach (var item in midTree)
{
tempList.Add(item);
if (item == rootTree)
{
isTree = true;
tempList.Remove(item);
leftTree = tempList;
tempList = new List<int>();
}
}
if (!isTree) {
Console.WriteLine("不是正确的树");
return null;
}
List<int> rightTree = tempList;
//递归左右节点
treeNode.left = Tree(preTree, leftTree);
treeNode.right = Tree(preTree, rightTree);
return treeNode;
}
/*
a
b c
x d f
前序 abxdcf
中序xbd a cf
第一次
a.left = tree (bxd,xbd) 【第一个参数应该是从a后取同等长度】
a.right = tree (cf,cf)
return a
第二次
tree (bxd,xbd)
b.left = tree (x,x)
b.right = tree ( d,d)
return b
tree (x,x)
x.left = tree(null,null)
x.right = tree(null,null)
return xbd
*/