重建二叉樹
阿新 • • 發佈:2020-08-01
重建二叉樹
題目描述:
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
題目思路:
一、遞迴
- 前序遍歷第一個是根節點。
- 根據根節點可以在中序遍歷中找到該節點的位置
- 中序遍歷根節點位置左邊的所有節點都是左子樹的節點,右邊的節點都是右子樹的節點。
- 然後根據左右兩邊各有多少個節點數目,在前序遍歷中可以劃分出[根節點|左子樹|右子樹].
- 然後遞迴在左右子樹中重建二叉樹。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder == null || preorder.length == 0) { return null; } //Map用來存放中序遍歷中根節點的位置,方便查詢,查詢為0(1) Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>(); int length = preorder.length; for (int i = 0; i < length; i++) { indexMap.put(inorder[i], i); } TreeNode root = buildTree(preorder, 0, length - 1, inorder, 0, length - 1, indexMap); return root; } public TreeNode buildTree(int[] preorder, int preorderStart, int preorderEnd, int[] inorder, int inorderStart, int inorderEnd, Map<Integer, Integer> indexMap) { if (preorderStart > preorderEnd) { return null; } //前序遍歷的第一個節點就是根節點 int rootVal = preorder[preorderStart]; TreeNode root = new TreeNode(rootVal); if (preorderStart == preorderEnd) { return root; } else { //獲取根節點的位置 int rootIndex = indexMap.get(rootVal); //計算中序遍歷中根節點左邊的節點數,即左子樹的節點數字,還有右邊同理。 int leftNodes = rootIndex - inorderStart, rightNodes = inorderEnd - rootIndex; //遞迴構建左子樹 TreeNode leftSubtree = buildTree(preorder, preorderStart + 1, preorderStart + leftNodes, inorder, inorderStart, rootIndex - 1, indexMap); //遞迴構建右子樹 TreeNode rightSubtree = buildTree(preorder, preorderEnd - rightNodes + 1, preorderEnd, inorder, rootIndex + 1, inorderEnd, indexMap); root.left = leftSubtree; root.right = rightSubtree; return root; } } }