LeetCode-106-從中序與後序遍歷序列構造二叉樹

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

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

題目描述:根據一棵樹的中序遍歷與後序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重複的元素。

示例說明請見LeetCode官網。

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

解法一:遞迴

根據中序遍歷和後序遍歷的性質,通過遞迴的方式求解,遞迴的過程如下:

  • 首先,如果中序遍歷序列或後序遍歷序列為空,直接返回空樹;
  • 因為後序遍歷序列的最後一個值為根節點,所以首先根據這個初始化得到當前的根節點root;
  • 然後根據根節點root在中序遍歷序列中的位置,根節點前面的值都是當前根節點的左子樹節點,得到當前根節點左右子樹節點的數量;
  • 然後通過呼叫遞迴方法得到當前根節點的左右子樹;
  • 最後返回root即為還原後的樹。
import com.kaesar.leetcode.TreeNode;

import java.util.Arrays;

public class LeetCode_106 {
    public static TreeNode buildTree(int[] inorder, int[] postorder) {
        // 如果中序遍歷序列或後序遍歷序列為空,直接返回空樹
        if (inorder == null || inorder.length == 0) {
            return null;
        }
        // 後序遍歷序列的最後一個值為根結點的值
        int rootVal = postorder[postorder.length - 1];
        TreeNode root = new TreeNode(rootVal);
        int leftCount = 0;
        // 中序遍歷序列前面的值為左子樹的節點,得到左子樹的節點數量
        for (int val : inorder) {
            if (val != rootVal) {
                leftCount++;
            } else {
                break;
            }
        }
        // 遞迴得到當前根節點的左右子樹
        root.left = buildTree(Arrays.copyOfRange(inorder, 0, leftCount), Arrays.copyOfRange(postorder, 0, leftCount));
        root.right = buildTree(Arrays.copyOfRange(inorder, leftCount + 1, inorder.length), Arrays.copyOfRange(postorder, leftCount, inorder.length - 1));
        return root;
    }

    public static void main(String[] args) {
        // 測試用例
        // 中序遍歷序列
        int[] inorder = new int[]{9, 3, 15, 20, 7};
        // 後序遍歷序列
        int[] postorder = new int[]{9, 15, 7, 20, 3};
        buildTree(inorder, postorder).print();
    }
}
【每日寄語】 命運負責洗牌,但是玩牌的是我們自己!

相關文章