LeetCode-105-從前序與中序遍歷序列構造二叉樹

雄獅虎豹發表於2021-11-19

從前序與中序遍歷序列構造二叉樹

題目描述:給定一棵樹的前序遍歷 preorder 與中序遍歷 inorder。請構造二叉樹並返回其根節點。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:遞迴法

通過遞迴的方式構造二叉樹,遞迴過程如下:

  • 如果前序遍歷序列或者中序遍歷序列為空時,直接返回空樹;
  • 因為前序遍歷序列的第一個值為根節點,所以首先得到根節點;
  • 然後根據中序遍歷中根節點的位置得到根節點的左右子樹的節點的數量leftCount和rightCount;
  • 然後遞迴呼叫該方法得到當前根節點的左右子樹;
  • 最後返回根節點。
import com.kaesar.leetcode.TreeNode;

import java.util.Arrays;

public class LeetCode_105 {
    public static TreeNode buildTree(int[] preorder, int[] inorder) {
        // 當前序遍歷序列或者中序遍歷序列為空時,直接返回空樹
        if (preorder == null || preorder.length == 0) {
            return null;
        }
        // 前序遍歷序列的第一個值為根節點
        TreeNode root = new TreeNode(preorder[0]);
        // 左子樹節點的數量
        int leftCount;
        // 中序遍歷序列中,根節點左邊的節點都是根節點左子樹的節點
        for (leftCount = 0; leftCount < inorder.length; leftCount++) {
            if (inorder[leftCount] == preorder[0]) {
                break;
            }
        }
        // 根據左子樹節點數和總的節點數計算右子樹節點的數量
        int rightCount = inorder.length - 1 - leftCount;

        // 遞迴呼叫得到當前節點的左右子樹
        root.left = buildTree(Arrays.copyOfRange(preorder, 1, leftCount + 1), Arrays.copyOfRange(inorder, 0, leftCount));
        root.right = buildTree(Arrays.copyOfRange(preorder, leftCount + 1, preorder.length), Arrays.copyOfRange(inorder, leftCount + 1, inorder.length));
        return root;
    }

    public static void main(String[] args) {
        int[] preorder = new int[]{3, 9, 20, 15, 7};
        int[] inorder = new int[]{9, 3, 15, 20, 7};
        buildTree(preorder, inorder).print();
    }
}
【每日寄語】 我的生活從艱辛到自如沒有強大的內心不可為之。無人能一手成就誰,真正的神在我心中。唯有自己努力方能見到曙光!

相關文章