zoukankan      html  css  js  c++  java
  • 二叉树

    重建二叉树:

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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));
        }
    }
  • 相关阅读:
    Linux脚本文件注释
    Linux三剑客之grep命令
    Linux获取本机IP
    Linux的cut命令详解
    Linux的wc命令详解
    Linux的uniq命令详解
    Linux的sort命令详解
    shell之a+b求和脚本的三种写法
    shell的文件比较运算符和字符串比较运算符
    shell中变量$系列的含义
  • 原文地址:https://www.cnblogs.com/hixin/p/4626535.html
Copyright © 2011-2022 走看看