面試題07. 重建二叉樹【LeetCode劍指offer】

題目:

面試題07. 重建二叉樹
在這裏插入圖片描述

思路:

  1. 要明白先序遍歷和中序遍歷的具體順序,
  2. 先找到先序遍歷的第一個元素,然後再去中序遍歷裏面查找這個元素,得到這個元素在中序的索引,那麼,在中序數組中,這個元素前面的元素都是這個元素的左子樹結點,這個元素的右邊都是這個元素的右子樹結點。
  3. 對這個元素的左子樹結點數組進行遞歸,
  4. 對這個元素的右子樹結點數組進行遞歸。

實現:

/**
 * 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;
        }
        //對中序數組遍歷,並將中序數組存入HashMap中保存,
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        int len = preorder.length;
        for (int i = 0; i < len; i++) {
            map.put(inorder[i], i);
        }
        // 開始遞歸
        TreeNode root = buildTree(preorder, 0, len - 1, inorder, 0, len - 1, map);
        return root;
    }

    public TreeNode buildTree(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd, Map<Integer, Integer> map) {
        if (preStart > preEnd) return null;
        int rootVal = preorder[preStart];
        TreeNode rootNode = new TreeNode(rootVal);
        if (preStart == preEnd)
            return rootNode;
        else {
            int rootIndex = map.get(rootVal);
            int leftNodes = rootIndex - inStart;
            int rightNodes = inEnd - rootIndex;
            TreeNode leftTree = buildTree(preorder, preStart + 1, preStart + leftNodes, inorder, inStart, rootIndex - 1, map);
            TreeNode rightTree = buildTree(preorder, preEnd - rightNodes + 1, preEnd, inorder, rootIndex + 1, inEnd, map);
            rootNode.left = leftTree;
            rootNode.right = rightTree;
            return rootNode;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章