由中序遍歷序列和前序遍歷序列重建二叉樹
阿新 • • 發佈:2019-02-15
- 中序遍歷
- 前序遍歷
- 重建二叉樹思想
- 程式碼實現
1.中序遍歷
在二叉樹中,中序遍歷是一種很常見的遍歷方式,首先遍歷左子樹,然後根節點,最後右子樹。
2.前序遍歷
前序遍歷是先遍歷根節點,然後左子樹,最後右子樹。
3.重建二叉樹思想
我們知道,前序遍歷的第一個數字就是根節點,由根節點的值我們在中序遍歷的序列中可以根據根節點的值區分出左子樹還有右子樹,以及每個子樹的結點的數目,然後我們由此在前序遍歷的序列中劃分出相應的左右子樹,進行遞迴進行。
4.程式碼實現
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
//重建二叉樹
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null||in==null) {
return null;
}
//進入遞迴函式
return reConstructTree(pre,0,pre.length-1,in,0,in.length-1);
}
public TreeNode reConstructTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
//判斷是否結束遞迴
if(startPre>endPre|startIn>endIn) {
return null;
}
int rootValue = pre[0];
TreeNode root=new TreeNode(rootValue);
root.left=null ;
root.right=null;
int indexIn=0;
//在中序遍歷序列中找到根節點的位置
for(int i=startIn;i<=endIn;i++) {
if(in[i]==rootValue) {
indexIn=i;
break;
}
}
//左子樹的結點個數
int leftLength= indexIn-startIn;
int leftPreEnd=startPre+leftLength;
//遞迴左右子樹
root.left=reConstructTree(pre,startPre+1,leftPreEnd,in,startIn,indexIn-1);
root.right=reConstructTree(pre,leftPreEnd+1,endPre,in,indexIn+1,endIn);
return root;
}