题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
- 前序查找第一个节点,根据前序遍历(根左右)的特性,第一个节点即为二叉树的根节点
- 根据1中找到的跟节点到中序序列中找到此根节点位置,根据中序遍历特性(左根右),中序序列中根节点位置之前的为二叉树的左子树,根节点位置之后的为右子树。
- 再对分别对左右子树进行1.2递归操作即可重建二叉树
如下图操作流程:**
class Solution
{
public TreeNode reConstructBinaryTree(int[] pre, int[] tin)
{
// write code here
//通过前序的第一个节点(跟节点)到中序序列中查找
int i=0;
if(pre.Length!=tin.Length||pre.Length==0||tin.Length==0)
return null;
//新建一个根节点
TreeNode root = new TreeNode(pre[0]);
//找到中序序列的根节点位置
while(tin[i]!=root.val)
i++;
//利用四个数组保存切割划分的序列
int[] preLeft = new int[i];
int[] inLeft = new int[i];
int[] preRight = new int[pre.Length-i-1];
int[] inRight = new int[tin.Length-i-1];
//对四个序列赋值
for(int j = 0;j<tin.Length;j++) {
if(j<i) {
preLeft[j] = pre[j+1];
inLeft[j] = tin[j];
} else if(j>i) {
preRight[j-i-1] = pre[j];
inRight[j-i-1] = tin[j];
}
}
//递归调用,构建左右子树
root.left = reConstructBinaryTree(preLeft,inLeft);
root.right = reConstructBinaryTree(preRight,inRight);
return root;
}
}