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

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

作者: 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