Leetcode---從前序與中序遍歷序列構造二叉樹--思路
阿新 • • 發佈:2018-12-05
從前序與中序遍歷序列構造二叉樹
題目連結:從前序與中序遍歷序列構造二叉樹
解題思路:
- 從遍歷序列構造二叉樹時,必須包含有中序遍歷,先序和後序是構造不了的
- 方法:首先找先序的第一個節點,它一定是樹的根節點,然後在中序序列中找到該節點的位置,左邊即為該節點的左子樹遍歷序列,右邊則為右子樹遍歷序列
- 再去構造子樹時,我們發現典型的遞迴構造
- 那麼構造單獨一個節點時,我們需要的是什麼?只需要當前遍歷的先序序列的節點(可以用陣列和下標來表示),中序序列中的部分序列(這棵子樹在中序序列中的範圍,用中序序列和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;
}