• 二叉树


    重建二叉树:

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
     
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
    
        TreeNode(int x) {
            val = x;
        }
    }
    
    public class BinaryTree1 {
        public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
            int rootValue = pre[0];
            TreeNode root = new TreeNode(rootValue);
            root.left = null;
            root.right = null;
            int len = in.length;
            if (len == 1 && pre[0] == in[0]) {
                return root;
            }
            int index = 0;
            for (int i = 0; i < len; i++) {
                if (in[i] == rootValue){
                    index = i;
                    break;
                }
                    
            }
            int leftNum = index;
            int rightNum = len - 1 - index;
    
            if (leftNum > 0) {
                int[] preLeftSub = new int[leftNum];
                System.arraycopy(pre, 1, preLeftSub, 0, leftNum);
    
                int[] inLeftSub = new int[leftNum];
                System.arraycopy(in, 0, inLeftSub, 0, leftNum);
    
                root.left = reConstructBinaryTree(preLeftSub, inLeftSub);
            }
    
            if (rightNum > 0) {
    
                int[] preRightSub = new int[rightNum];
                System.arraycopy(pre, leftNum + 1, preRightSub, 0, rightNum);
    
                int[] inRightSub = new int[rightNum];
                System.arraycopy(in, index + 1, inRightSub, 0, rightNum);
    
                root.right = reConstructBinaryTree(preRightSub, inRightSub);
    
            }
    
            return root;
    
        }
        
        
        
        /**
         * 递归打印出二叉树
         */
    
    
        /**
         * 从根结点开始遍历,从树的最高层叶子结点开始输出,从左至右
         * @param node    当前的结点
         */
    
        void printTree(TreeNode node) {
            if(node == null){
                return;
            }else{
                
                printTree(node.left);
                System.out.print(node.val+"  ");
                printTree(node.right);
                
            }
            
        }
    }

    测试用例:

    import junit.framework.TestCase;
    public class BinaryTree1Test extends TestCase{
        public void test(){
            BinaryTree1 bt = new BinaryTree1();
            int[] a ={1,2,3,4,5,6,7};
            int[] b ={3,2,4,1,6,5,7};
            bt.printTree(bt.reConstructBinaryTree(a, b));
        }
    }
  • 相关阅读:
    4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(
    PlSql加入数据库链接
    UserScan的处理流程分析
    第八十八题(金山笔试题,字符串移动)
    4Sum_leetCode
    LeetCode Add Binary
    Hibernate or JPA Annotation中BLOB、CLOB注解写法
    配置Nginx防止直接用IP訪问Webserver
    Java集合系列之TreeMap源代码分析
    使用Application Loader上传APP流程解读[APP公布]
  • 原文地址:https://www.cnblogs.com/hixin/p/4626535.html
Copyright © 2020-2023  润新知