文章目錄
- 題目
- 分析
- 代碼
題目
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹,假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字,例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并回傳,
分析
根據中序遍歷和前序遍歷可以確定二叉樹,具體程序為:
- 根據前序序列第一個結點確定根結點
- 根據根結點在中序序列中的位置分割出左右兩個子序列
- 對左子樹和右子樹分別遞回使用同樣的方法繼續分解
例如:
前序序列{1,2,4,7,3,5,6,8} = pre
中序序列{4,7,2,1,5,3,8,6} = in
- 根據當前前序序列的第一個結點確定根結點,為 1
- 找到 1 在中序遍歷序列中的位置,為 in[3]
- 切割左右子樹,則 in[3] 前面的為左子樹, in[3] 后面的為右子樹
- 則切割后的左子樹前序序列為:{2,4,7},切割后的左子樹中序序列為:{4,7,2};切割后的右子樹前序序列為:{3,5,6,8},切割后的右子樹中序序列為:{5,3,8,6}
- 對子樹分別使用同樣的方法分解



代碼
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if (pre.length == 0 || in.length == 0) return null;
//謙虛遍歷第一個節點即為根節點
TreeNode root = new TreeNode(pre[0]);
//在中序遍歷中找到根節點,根節點左邊為左子樹,右邊為右子樹
for (int i = 0; i < in.length; i++) {
if (in[i] == pre[0]) {
// 左子樹,注意 copyOfRange 函式,左閉右開
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(in, i+1, in.length));
break;
}
}
return root;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256786.html
標籤:java
上一篇:重寫的介紹/重寫與多載的區別
下一篇:Web全堆疊~31.并發
