劍指Offer #04 重建二叉樹(遞歸)

題目來源:牛客網-劍指Offer專題
題目地址:重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

題目解析

n+1n+1 次遇到這種題目了,簡單寫一下思路吧。

  • 根據前序遍歷的性質確定根節點,然後在中序遍歷中查詢根節點的位置。
  • 這樣就得到了中序遍歷左右子樹的範圍了,接下來就是要求左子樹的節點的個數。
  • 求得左子樹節點個數之後,我們就知道了前序遍歷中左右子樹的範圍了。
  • 建樹的過程是遞歸的,我們要做的就是對左右子樹重複上述過程
    在這裏插入圖片描述
    (上圖爲一次求解過程的圖示)

想看更詳細解析的可以看這篇: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;
    }
}

如果本文對你有所幫助,要記得點贊哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章