zoukankan      html  css  js  c++  java
  • 根据二叉树前序遍历和中序遍历 构造二叉树

    数据结构的定义:

    树的顶节点定义:

    public class BinaryTree<T> extends BinaryTreeNode<T> {
        private int count;
    
        public int getCount() {
            return count;
        }
    
        public void setCount(int count) {
            this.count = count;
        }
    
        public BinaryTree(T data) {
            super(data);
            this.count = 1;
        }
    }
    

     节点定义:

    package com.itmei.offer;
    
    /**
     * Created by qiaodan on 2017/12/8.
     */
    public class BinaryTreeNode<T> {
        private T data;
        private BinaryTreeNode<T> left;
        private BinaryTreeNode<T> right;
    
        public BinaryTreeNode<T> getLeft() {
            return left;
        }
    
        public void setLeft(BinaryTreeNode<T> left) {
            this.left = left;
        }
    
        public BinaryTreeNode<T> getRight() {
            return right;
        }
    
        public void setRight(BinaryTreeNode<T> right) {
            this.right = right;
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
        public BinaryTreeNode(T data) {
            this.data = data;
        }
    }
    

    泛型对象:

    package com.itmei.offer;
    
    /**
     * Created by qiaodan on 2017/12/8.
     */
    public class Person {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "姓名:"+this.getName()+"年龄:"+this.getAge();
        }
    
    }
    

     二叉树构造主方法:

      /**
         * 问题8、根据根据前序遍历和中序遍历 确定 构造一个 二叉树
         */
        @Test
        public void contructionBinaryTree(){
            int[] pre = {1,2,4,7,3,5,6,8};
            int[] middle = {4,7,2,1,5,3,8,6};
            int root = 0;
            int startL = 0;
            int endL = foundNumIndexinMiddle(pre[root],middle)-1;
            int startR = foundNumIndexinMiddle(pre[root],middle)+1;
            int endR = middle.length-1;
            Person rootPerson = new Person();
            int val = pre[root];
            System.out.println(val);
            rootPerson.setName("node"+pre[root]);
            rootPerson.setAge(pre[root]);
            BinaryTree<Person> tree = new BinaryTree<Person>(rootPerson);
            tree.setCount(pre.length);
            root++;
            tree.setLeft(constructBTCore(root,startL,endL,middle,pre));
            root = startR;
            if (startR==endR){
                root++;
            }
            tree.setRight(constructBTCore(root,startR,endR,middle,pre));
            System.out.println(tree.getLeft().getData().getName());
            System.out.println(tree.getRight().getData().getName());
        }
    

     添加二叉树非根节点的递归方法(核心实现):

      public BinaryTreeNode<Person> constructBTCore(int rootindex,int start,int end,int[] middle,int[] pre){
    
            Person p = new Person();
            p.setName("node"+pre[rootindex]);
            p.setAge(pre[rootindex]);
            BinaryTreeNode<Person> tree = new BinaryTreeNode<>(p);
            tree.setLeft(null);
            tree.setRight(null);
    
            int startL = start;
            int endL = foundNumIndexinMiddle(pre[rootindex],middle)-1;
            int startR = foundNumIndexinMiddle(pre[rootindex],middle)+1;
            int endR = end;
            if (start<end && rootindex<pre.length) {
                if (startL <= endL&&startL>=start) {
                    rootindex++;
                    tree.setLeft(constructBTCore(rootindex, startL, endL, middle, pre));
                }
    
                if (startR < endR && rootindex<pre.length&&endR<=end) {
                    rootindex = startR;
                    tree.setRight(constructBTCore(rootindex, startR, endR, middle, pre));
                } else if(startR==endR){
                    rootindex++;
                    tree.setRight(constructBTCore(rootindex, startR, endR, middle, pre));
                }
            }
            return tree;
        }
    

    使用到了工具方法:

        public int foundNumIndexinMiddle(int num,int[] arr){
    
            for (int i=0;i<arr.length;i++){
                if (arr[i]==num)
                    return i;
            }
            return 0;
        }
    

     构造结果:

  • 相关阅读:
    channel分析
    Nginx|基础
    item2
    搜索引擎技巧
    计算机网络|概述
    操作系统|进程
    分布式事务一致性
    画图工具StartUML
    内存分配
    MPG分析
  • 原文地址:https://www.cnblogs.com/Jordandan/p/8006601.html
Copyright © 2011-2022 走看看