欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面试题07. 重建二叉树【LeetCode剑指offer】

程序员文章站 2022-06-17 16:58:31
...

题目:

面试题07. 重建二叉树
面试题07. 重建二叉树【LeetCode剑指offer】

思路:

  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;
        }
    }
}