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


    问题描述:

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

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]

    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7

    解题思路:

    二叉树的先序遍历先访问根结点,其次遍历根节点的左子树,然后遍历根节点的右子树。

    中序遍历,先遍历左子树,然后遍历根结点,最后遍历右子树。

    因此中序遍历序列被根节点分为两部分:根结点之前的部分为左子树结点中序序列,根结点之后的为右子树结点中序序列。

    例如:已知一颗二叉树的先序序列为EBADCFHG,其中序序列为ABCDEFGH。下图说明了还原二叉树的过程:

     首先由先序序列知道二叉树的根结点为E,则其左子树的中序序列为ABCD,右子树的中序序列为FGH。

    继而得到左子树先序序列为BADC,右子树先序序列为FHG。

    重复上述步骤。

    实现代码:

        private static TreeNode test(int[] preorder, int p, int q, int[] inorder, int i, int j) {
    
            if (p > q) return null;
            if (p == q) return new TreeNode(preorder[p]);
    
            TreeNode node = new TreeNode(preorder[p]);
            int k = i;
            // 找到根节点在中序遍历序列中的位置
            while (preorder[p] != inorder[k]) k++;
            node.left = test(preorder, p+1, p+k-i, inorder, i, k-1);
            node.right = test(preorder, p+k-i+1, q, inorder, k+1, j);
    
            return node;
        }
    
        public static TreeNode buildTree(int[] preorder, int[] inorder) {
            return test(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1);
        }
  • 相关阅读:
    [poj_3469]多核CPU
    割点与桥,强连通分量,点双,边双[poj_1236]学校网络
    Iview 启动报错 TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
    修改JAVA_HOME失效
    命令模式
    gradle implementation runtimeOnly 和api 区别
    spring boot 整合 RabbitMQ 错误
    关于技术的想法
    eclipse 背景绿豆沙颜色
    抽象工厂模式
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9296469.html
Copyright © 2020-2023  润新知