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

    一. 问题描述

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

    注意:

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

    例如,给出

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

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

    返回如下的二叉树:

        3

       /

      9  20

        / 

       15   7

    二. 解题思路

    本题思路:了解前序遍历和中序遍历的特点并利用递归算法进行求解。前序特点:第一个元素必定是根节点,而中序遍历的特点是,根节点左右必定是左右子树的节点的集合。

    步骤一:构建递归函数(前序遍历数组:preorder,int num 根节点在前序遍历数组的index值,当前中序遍历的list,root,当前根节点)

    步骤二:通过preorder[num]找到当前中序遍历list中的左右子树所有值,并将左子树集合放入leftlist中,右子树集合放入rightlist中。

    步骤三:通过前序中序原理,找到左子树集合和右子树集合的当前根节点root.left和root.right。并将num值变成当前根节点值的index。重复步骤一重复递归函数(preorder,newleftnum,leftlist,root.left)和(preorder,newrightnum,rightlist,root.right)

    步骤四:当list中只剩下根节点时,则返回,最后输出root。

     

    三. 执行结果

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

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

    四. Java代码

    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
              if(preorder.length>0) {
                 TreeNode root =new TreeNode(preorder[0]);
                 List<Integer> order=new ArrayList<Integer>();
                 for(int i=0;i<inorder.length;i++) {
                     order.add(inorder[i]);
                 }
                 getTree(preorder,0,order,root);         
                 return root;
             } else {
                 return null;
             }
        }
        
        public void getTree(int[]preorder ,int number,List<Integer> order,TreeNode root) {
            if(order.size()==1) {
                return ;
            }
            
            int ordernum=order.indexOf(preorder[number]);
            if(ordernum>0) {
            List<Integer> leftOrder=new ArrayList<Integer>(order.subList(0, ordernum));        
            for(int i=number+1;i<preorder.length;i++)
            {
                if(leftOrder.contains(preorder[i])) {
                    root.left=new TreeNode(preorder[i]);
                    getTree(preorder,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<preorder.length;j++) {
                    if(rightOrder.contains(preorder[j])) {
                        root.right=new TreeNode(preorder[j]);
                        getTree(preorder,j,rightOrder,root.right);
                        break;
                    }
                }
            }
           
        }
    }
  • 相关阅读:
    socket套接字通信和粘包问题
    TCP协议
    网络编程
    单例模式
    类的内置方法(魔法方法)
    反射(hasattr和getattr和setattr和delattr)
    isinstance与issubclass
    绑定方法与非绑定方法
    鸭子类型
    类的多态和抽象类
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11825787.html
Copyright © 2011-2022 走看看