1. 程式人生 > 其它 >力扣LeetCode #106 從中序與後序遍歷序列構造二叉樹(buildTree)

力扣LeetCode #106 從中序與後序遍歷序列構造二叉樹(buildTree)

技術標籤:二叉樹leetcode資料結構演算法java

- 題目描述

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。

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

來源:LeetCode

- 示例

給出:
中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:

3
/ \
9 20
/ \
15 7

- 思路分析

  • 可見#105,兩道題一樣的思路。區別在於前序中頭是根節點,後序中尾是根節點。
  • 這道題的程式碼更簡潔,因為學習了上道題評論區裡的寫法。
  • Arrays.copyOfRange(inorder, start, end):建立一個新陣列,是inorder[start]到inorder[end-1],不包含inorder[end]

- JAVA實現

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { //兩種base case if(inorder.length == 0) return null; if(inorder.length == 1){ TreeNode root = new TreeNode(inorder[0]); return root; } TreeNode root = new
TreeNode(postorder[postorder.length-1]); int start = 0, end = inorder.length; for(int i=start; i<end; i++) { if(inorder[i] == root.val) { root.left = buildTree(Arrays.copyOfRange(inorder, start, i), Arrays.copyOfRange(postorder, start, i)); root.right = buildTree(Arrays.copyOfRange(inorder, i+1, end), Arrays.copyOfRange(postorder, i, end-1)); } } return root; } }