LeetCode-106-從中序與後序遍歷序列構造二叉樹
阿新 • • 發佈:2021-11-14
從中序與後序遍歷序列構造二叉樹
題目描述:根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遞迴
根據中序遍歷和後序遍歷的性質,通過遞迴的方式求解,遞迴的過程如下:
- 首先,如果中序遍歷序列或後序遍歷序列為空,直接返回空樹;
- 因為後序遍歷序列的最後一個值為根節點,所以首先根據這個初始化得到當前的根節點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(); } }
【每日寄語】 命運負責洗牌,但是玩牌的是我們自己!