zoukankan      html  css  js  c++  java
  • 中序与后序遍历序列构造二叉树

    问题描述:

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

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

    例如,给出

    中序遍历 inorder = [9,3,15,20,7]
    后序遍历 postorder = [9,15,7,20,3]

    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7

    解题思路:

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

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

    后序遍历,最后遍历根节点,故后序序列的最后一个元素为根节点。

    由根节点在中序序列中的位置,可得到左子树与右子树的中序序列,也可得到左子树与右子树的后续序列。

    实现代码:

        private static Map<Integer, Integer> map;
    
        private static TreeNode build(int[] postorder, int p, int q, int[] inorder, int i, int j) {
    
            if (p > q) return null;
            if (p == q) return new TreeNode(postorder[q]);
    
            TreeNode node = new TreeNode(postorder[q]);
            int k = map.get(postorder[q]);
            node.left = build(postorder, p, p+k-i-1, inorder, i, k-1);
            node.right = build(postorder, p+k-i, q-1, inorder, k+1, j);
    
            return node;
        }
    
        public static TreeNode buildTree(int[] inorder, int[] postorder) {
    
            map = new HashMap<Integer, Integer>(inorder.length);
            for (int i=0; i<inorder.length; i++) map.put(inorder[i], i);
            return build(postorder, 0, postorder.length-1, inorder, 0, inorder.length-1);
        }
  • 相关阅读:
    集合的遍历和扩容原理
    最新鲜最详细的Android SDK下载安装及配置教程
    开启IIS Express可以调试X64项目
    C# 正则表达式大全
    Windows下SQLMAP的安装图解
    当前比较流行的前端框架2
    前端组件库1
    服务器Windows 登录 出现401 错误
    IPV6配置
    implicit和 explicit关键字
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9301523.html
Copyright © 2011-2022 走看看