zoukankan      html  css  js  c++  java
  • 牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端

       总结:

       重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可

    [编程题]重建二叉树
    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
     
    完整通过代码:
    先新建一个二叉树的类
    public class TreeNode {
        int val;
        TreeNode left;
       TreeNode right;
        TreeNode(int x) { val = x; }
    }
    

     再 

    public class reConstructBinaryTree {
         public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
                   if(pre==null||in==null){       return null;            }
                   TreeNode tree = reConstructCore(pre,in,0,pre.length-1,0,in.length-1);
                   return tree;
         }
         /**
            *核心算法,preStart和preEnd是起始下标和结束下标
            **/
          public static TreeNode reConstructCore(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
                TreeNode tree = new TreeNode(pre[preStart]);
                tree.left = null;
                tree.right= null;             
                if(preStart==preEnd&&inStart==inEnd){ return tree;   }
                //记录中序遍历中等于前序遍历的第一位的下标
                int inCenter = 0;
                for(inCenter = inStart;inCenter<inEnd;inCenter++){
                    if(in[inCenter]==pre[preStart]){
                        break;
                    }
                }
                //左子树的长度
                int leftTreeLength = inCenter-inStart;
                //右子数的长度
                int rightTreeLength = inEnd-inCenter;             
                if(leftTreeLength>0){
                   tree.left = reConstructCore(pre,in,preStart+1,preStart+leftTreeLength,inStart,inCenter-1);
                }             
                if(rightTreeLength>0){
                   tree.right = reConstructCore(pre,in,preStart+leftTreeLength+1,preEnd,inCenter+1,inEnd);
                }
              return tree;   
                 
          }
          public static void traverseBinTreeRDL(TreeNode node){
              if (node==null) {    return;            }
              if (node.left!=null) {  
                  traverseBinTreeRDL(node.left);    }
              if(node.right!=null) {  
                  traverseBinTreeRDL(node.right);   }
              System.out.println(node.val);
            }    
        public static void main(String[] arg0){
            int pre[]= {1,2,4,7,3,5,6,8};
            int in[] = {4,7,2,1,5,3,8,6};
            TreeNode tree = reConstructBinaryTree(pre, in);
            traverseBinTreeRDL(tree);        
         }
        
    }

    输出:

    7
    4
    2
    5
    8
    6
    3
    1

  • 相关阅读:
    php 数据类型
    Django REST framework基础:视图和路由
    Django REST framework基础:序列化
    android 适配器 ArrayAdapter,SimpleAdapter的学习
    关于系统模块设计的一点疑问?
    看了看 #ifndef 和#pragma once 的区别
    ace.js 中文手册
    .net core 3.1发布时视图Views文件夹不被打打包成.dll文件解决办法
    Asp.net core应用在 Kubernetes上内存使用率过高问题分析
    .Net Core内存回收模式及性能测试对比
  • 原文地址:https://www.cnblogs.com/snowwhite/p/4746374.html
Copyright © 2011-2022 走看看