• 牛客_剑指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

  • 相关阅读:
    mac下使用brew安装mongodb
    从零构建vue+webpack (一)
    常用软件集合(2018/08/22)
    solr集群安装部署
    zookeeper集群部署
    redis集群部署
    linux 安装jdk
    zTab layui多标签页组件
    spring boot集成swagger2
    SSH客户端,FinalShell服务器管理,远程桌面加速软件,支持Windows,Mac OS X,Linux,版本2.6.3.1
  • 原文地址:https://www.cnblogs.com/snowwhite/p/4746374.html
Copyright © 2020-2023  润新知