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

    一. 问题描述

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

    注意:

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

    例如,给出

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

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

    返回如下的二叉树:

        3

        /

       9  20

            / 

          15   7

    二. 解题思路

    本题思路:采用中序和后序遍历的特性进行求解,跟第105题几乎完全相同,只是把前序第一个必定是根节点,改成后序最后一个必定是根节点这点区别,没啥说的,具体可看第105题。

    三. 执行结果

    执行用时 :21 ms, 在所有 java 提交中击败了37.40%的用户

    内存消耗 :51.4 MB, 在所有 java 提交中击败了8.79%的用户

    四. Java代码

    class Solution {
        public TreeNode buildTree(int[] inorder, int[] postorder) {
            if(postorder.length>0) {
                 TreeNode root =new TreeNode(postorder[postorder.length-1]);
                 List<Integer> order=new ArrayList<Integer>();
                 for(int i=0;i<inorder.length;i++) {
                     order.add(inorder[i]);
                 }
                 getTree(postorder,postorder.length-1,order,root);         
                 return root;
             } else {
                 return null;
             }
        }
          public void getTree(int[]postorder ,int number,List<Integer> order,TreeNode root) {
            if(order.size()==1) {
                return ;
            }
            
            int ordernum=order.indexOf(postorder[number]);
            if(ordernum>0) {
            List<Integer> leftOrder=new ArrayList<Integer>(order.subList(0, ordernum));        
            for(int i=number-1;i>=0;i--)
            {
                if(leftOrder.contains(postorder[i])) {
                    root.left=new TreeNode(postorder[i]);
                    getTree(postorder,i,leftOrder,root.left);
                    break;
                }
                
             }
            }
            
            if(ordernum<order.size()-1)
            {
                List<Integer> rightOrder=new ArrayList<Integer>(order.subList(ordernum+1, order.size()));
                for(int j=number-1;j>=0;j--) {
                    if(rightOrder.contains(postorder[j])) {
                        root.right=new TreeNode(postorder[j]);
                        getTree(postorder,j,rightOrder,root.right);
                        break;
                    }
                }
            }
           
        }
    }
  • 相关阅读:
    学习Linux shell脚本中连接字符串的方法
    使用 ffmpeg 转换视频格式
    一点不懂到小白的linux系统运维经历分享
    linux利用scp远程上传下载文件/文件夹
    angular ui-select
    JavaScript sort()方法
    js性能优化
    layer弹出层
    JS复制对象
    某天修改了啥bat批处理
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11829126.html
Copyright © 2011-2022 走看看