題目來源:牛客網-劍指Offer專題
題目地址:重建二叉樹
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
題目解析
第 次遇到這種題目了,簡單寫一下思路吧。
- 根據前序遍歷的性質確定根節點,然後在中序遍歷中查詢根節點的位置。
- 這樣就得到了中序遍歷左右子樹的範圍了,接下來就是要求左子樹的節點的個數。
- 求得左子樹節點個數之後,我們就知道了前序遍歷中左右子樹的範圍了。
- 建樹的過程是遞歸的,我們要做的就是對左右子樹重複上述過程。
(上圖爲一次求解過程的圖示)
想看更詳細解析的可以看這篇:L2-006 樹的遍歷-團體程序設計天梯賽GPLT
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int r = pre.length - 1;
TreeNode root = buildTree(pre, in, 0, r, 0, r);
return root;
}
//[la,ra]爲前序遍歷序列範圍,[lb,rb]爲中序遍歷序列的範圍
public TreeNode buildTree(int [] pre,int [] in,
int la, int ra, int lb, int rb) {
if (la > ra || lb > rb) {
return null;
}
//num表示根節點的權值
int num = pre[la];
TreeNode rt = new TreeNode(num);
//p表示根節點在中序遍歷序列中的位置
int p = lb;
while (p <= rb && in[p] != num) p++;
//cnt表示左子樹節點的個數
int cnt = p - lb;
//遞歸建樹
rt.left = buildTree(pre, in, la + 1, la + cnt, lb, p - 1);
rt.right = buildTree(pre, in, la+ cnt + 1, ra, p + 1, rb);
return rt;
}
}
如果本文對你有所幫助,要記得點贊哦~