美文网首页算法代码
从前序与中序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树

作者: windUtterance | 来源:发表于2020-06-08 11:57 被阅读0次

    题目描述
    根据一棵树的前序遍历与中序遍历构造二叉树。

    示例
    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:

    3
    / \
    9 20
    / \
    15 7
    先序遍历的顺序是根节点、左子树、右子树;中序遍历的顺序是左子树,根节点,右节点。所以我们需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树,右边就是右子树。生成左子树和右子树之后就可以递归的进行了。

    Java代码

    /**
     * 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) {
            //使用HashMap将中序遍历数组的每个元素的下标和值存起来,方便查找根节点
            HashMap<Integer, Integer> map = new HashMap<>();
            for(int i = 0;i < inorder.length;i++) {
                map.put(inorder[i], i);
            }
            return buildTreeHelper(preorder, 0, preorder.length, inorder, 0, inorder.length, map);
        }
    
        private TreeNode buildTreeHelper(int[] preorder, int p_start, int p_end, int[] inorder, int i_start, int i_end, HashMap<Integer, Integer> map) {
            if(p_start == p_end) return null;
            int root_val = preorder[p_start];
            TreeNode root = new TreeNode(root_val);
            //寻找根节点
            int i_root_index = map.get(root_val);
            int left_num = i_root_index - i_start;
            //递归构造左子树
            root.left = buildTreeHelper(preorder, p_start + 1, p_start +left_num + 1, inorder,
                                            p_start, i_root_index, map);
            //递归构造右子树
            root.right = buildTreeHelper(preorder, p_start + left_num + 1, p_end, inorder, 
                                            i_root_index + 1, i_end, map);
            return root; 
        }
    }
    

    相关文章

      网友评论

        本文标题:从前序与中序遍历序列构造二叉树

        本文链接:https://www.haomeiwen.com/subject/hfhltktx.html