从前序与中序遍历序列构造二叉树
题目链接:从前序与中序遍历序列构造二叉树
解题思路:
- 从遍历序列构造二叉树时,必须包含有中序遍历,先序和后序是构造不了的
- 方法:首先找先序的第一个节点,它一定是树的根节点,然后在中序序列中找到该节点的位置,左边即为该节点的左子树遍历序列,右边则为右子树遍历序列
- 再去构造子树时,我们发现典型的递归构造
- 那么构造单独一个节点时,我们需要的是什么?只需要当前遍历的先序序列的节点(可以用数组和下标来表示),中序序列中的部分序列(这棵子树在中序序列中的范围,用中序序列和front,rear下标表示即可)
- front>rear时表明该树为空,相等时表示该树仅有一个节点,其余情况应当继续递归,代码如下:
public TreeNode buildTree(int[] preorder, int[] inorder) {
int front = 0,rear = preorder.length-1,index = 0;
return buildTree(inorder,front,rear,preorder,index);
}
TreeNode buildTree(int[] inorder, int front,int rear,int[] preorder,int index) {
if(front>rear) {
//当前节点应当为空
return null;
}else if(front==rear) {
//只含有一个根节点
return new TreeNode(inorder[front]);
}
//在front到rear范围内遍历inorder[i] = preorder[index]
int mid = 0;
for(int i = front;i<=rear;i++) {
if(inorder[i]==preorder[index]) {
mid = i;
break;
}
}
int front1 = front,rear1 = mid-1,front2 = mid+1,rear2 = rear;
//构造当前节点
TreeNode node = new TreeNode(inorder[mid]);
//构造左子树
node.left = buildTree(inorder,front1,rear1,preorder,index+1);
//构造右子树
node.right = buildTree(inorder,front2,rear2,preorder,index+rear1-front1+2);
return node;
}