[演算法練習及思路-leetcode劍指offer(Java解法)]No05.重建二叉樹
阿新 • • 發佈:2020-12-15
技術標籤:JAVA演算法練習劍指offer二叉樹演算法資料結構leetcodejava
題目
題號:5
題目名: 重建二叉樹
程式語言
Java
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
初次思路
前序遍歷和中序遍歷,中序遍歷和後續遍歷都是一樣的邏輯
邏輯:
1.根據前序或者後續遍歷找到根節點
2.根節點找到在中序遍歷的位置
3.使用中序遍歷根節點左邊的資料做左子樹,右邊的資料做右子樹
4.這是一個遞迴過程,如果建樹成功則退出迴圈
解題程式碼
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
//中序遍歷的兩邊的結點,左邊是他的左子樹,右邊是他的右子樹
//前序遍歷先找到的是根節點
//找到根節點,根節點的左子樹是中序遍歷左邊的數,右子樹是中序遍歷右邊的數
//如果結點個數是0個,那麼直接返回空
if(preorder==null||preorder.length==0) return null;
int len = preorder.length;
//前序遍歷的結點是當前的根節點
TreeNode root = new TreeNode(preorder[0]);
int idx = -1;
//從中序遍歷找到當前結點的位置
for (int i = 0; i < preorder.length; i++) {
if(preorder[0]==inorder[i]){
idx = i;
break;
}
}
//構造當前節點的左子樹
root.left = buildTree(Arrays.copyOfRange(preorder,1,idx+1),Arrays.copyOfRange(inorder,0,idx));
//構造當前節點的右子樹
root.right = buildTree(Arrays.copyOfRange(preorder,idx +1,len),Arrays.copyOfRange(inorder,idx+1,len));
return root;
}
}