劍指 Offer - 4:重建二叉樹
阿新 • • 發佈:2018-11-26
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列 {1,2,4,7,3,5,6,8} 和中序遍歷序列 {4,7,2,1,5,3,8,6},則重建二叉樹並返回
題目連結:https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
解題思路
根據前序遍歷的特點,我們可以通過第一個值得到當前子樹的根節點,藉此去中序遍歷查詢根節點的左子樹和右子樹,採用遞迴的思路
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
// 獲取根節點
int val = pre[0];
TreeNode root = new TreeNode(val);
// 得到左子樹的大小
int len = 0;
for (; len < in.length; len++) {
if (in[len] == val) break;
}
// 構建左子樹
if (len != 0) {
// 左子樹的先序遍歷
int[] pre_left = new int[len];
for (int i = 0; i < len; i++) {
pre_left[i] = pre[i+1];
}
// 左子樹的中序遍歷
int[] in_left = new int[len];
for (int i = 0; i < len; i++) {
in_left[ i] = in[i];
}
root.left = reConstructBinaryTree(pre_left, in_left);
}
// 構建右子樹
if (len != (pre.length-1)) {
// 右子樹的先序遍歷
int[] pre_right = new int[pre.length-len-1];
for (int i = 0, idx = len+1; idx < pre.length; i++, idx++) {
pre_right[i] = pre[idx];
}
// 右子樹的中序遍歷
int[] in_right = new int[in.length-len-1];
for (int i = 0, idx = len+1; idx < in.length; i++, idx++) {
in_right[i] = in[idx];
}
root.right = reConstructBinaryTree(pre_right, in_right);
}
return root;
}
}