• 二叉树


    17.11.9

    (1)创建1棵排序二叉树,用非递归的方法(用栈)遍历

    参考:http://blog.csdn.net/kerryfish/article/details/24309617

    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.Map;
    import java.util.Queue;
    import java.util.Stack;
    public class BuildBTpaixu {
        public void buildTree(int[]arr) {
            for(int node:arr) {
                insert(node);
            }
        }
        BinaryNode2 root;
        private void insert(int ele) {
            root=insert(root,ele);
        }
        private BinaryNode2 insert(BinaryNode2 root,int ele) {
            if(root==null)
                return new BinaryNode2(ele);
            if(root.ele>ele)
                root.left=insert(root.left,ele);
            else if(root.ele<ele)
                root.right=insert(root.right,ele);
            else
                root.left=insert(root.left,ele);
            return root;
        }
    //     先序遍历
    //    模拟递归的过程,将左子树不断压入栈,直到为null,然后处理栈的右子树。这种方式具备扩展性【原作者所说】
        public void preOrder(BinaryNode2 root) {
            if(root==null)return;
            Stack<BinaryNode2>stack=new Stack<BinaryNode2>();
            
            while(root!=null||!stack.isEmpty()) {
                while(root!=null) {
                    System.out.print(root.ele+" ");
                    stack.push(root);
                    root=root.left;
                }
                root=stack.pop();
                root=root.right;//如果是null,出栈处理右子树
            }
            
        }
    //    中序遍历,思想同以上。
        public void inOrder(BinaryNode2 root) {
            if(root==null)return;
            Stack<BinaryNode2>stack=new Stack<BinaryNode2>();
            while(root!=null||!stack.isEmpty()) {
                while(root!=null) {
                    stack.push(root);
                    root=root.left;
                }
                root=stack.pop();
                System.out.print(root.ele+" ");
                root=root.right;
            }    
        }
        /**
         * 后序遍历不同于前序、中序遍历,它是要先处理左右子树,在处理根(回溯),所以需要一个记录哪些节点
         * 已经被访问过的结构(可以在树里面加一个标记),用map实现。
         * @param root
         */
        public void postOrder(BinaryNode2 root) {
            if(root==null)return;
            Stack<BinaryNode2>stack=new Stack<BinaryNode2>();
            Map<BinaryNode2,Boolean>map=new HashMap<>();
            stack.push(root);
            while(!stack.isEmpty()) {
                BinaryNode2 temp=stack.peek();
                if(temp.left!=null&&!map.containsKey(temp.left)) {
                    temp=temp.left;
                    while(temp!=null) {
                        stack.push(temp);
                        temp=temp.left;
                    }
                    continue;
                }
                if(temp.right!=null&&!map.containsKey(temp.right)) {
                    stack.push(temp.right);
                    continue;
                }
                BinaryNode2 t=stack.pop();
                map.put(t, true);
                System.out.print(t.ele+" ");
            }
        }
        public void levelTravel(BinaryNode2 root){
            if(root==null)return;
            Queue<BinaryNode2>q=new LinkedList<BinaryNode2>();
            q.add(root);
            while(!q.isEmpty()) {
                BinaryNode2 temp=q.poll();
                System.out.print(temp.ele+" ");
                if(temp.left!=null) {
                    q.add(temp.left);
                }
                if(temp.right!=null) {
                    q.add(temp.right);
                }
            }
        }
        public static void main(String[] args) {
            int[]arr= {2,4,5,1,3};
            BuildBTpaixu btp=new BuildBTpaixu();
            btp.buildTree(arr);
            BinaryNode2 root=btp.root;
            System.out.println("二叉树的根是:"+root.ele);
            System.out.println("中序遍历:");
            btp.inOrder(root);
            System.out.println();
            System.out.println("前序遍历:");
            btp.preOrder(root);
            System.out.println();
            System.out.println("后序遍历:");
            btp.postOrder(root);
            System.out.println();
            System.out.println("层次遍历:");
            btp.levelTravel(root);
        }
    }

    (2) 递归遍历&返回当前二叉树的深度

    /**
     * 参考:http://blog.csdn.net/gfj0814/article/details/51637696
     * 性质1:在二叉树的第i层上至多有2^(i-1)个节点(i >= 1)
     * 性质2:深度为k的二叉树至多有2^(k-1)个节点(k >=1)
     * 性质3:对于任意一棵二叉树T而言,其叶子节点数目为N0,度为2的节点数目为N2,则有N0 = N2 + 1
     */
    import java.util.List;
    import java.util.ArrayList;
    
    public class BinaryTraversal {
        BinaryNode root;
        private List<BinaryNode>list=new ArrayList<BinaryNode>();
        public BinaryTraversal(){
            init() ;
        }
        
        public List<BinaryNode> getList() {
            return list;
        }
    
        public void setList(List<BinaryNode> list) {
            this.list = list;
        }
    
        public void init() {
            BinaryNode x=new BinaryNode("x");
            BinaryNode y=new BinaryNode("y");
            BinaryNode d=new BinaryNode("d",x,y);
            BinaryNode e=new BinaryNode("e");
            BinaryNode f=new BinaryNode("f");
            BinaryNode c=new BinaryNode("c",e,f);
            BinaryNode b=new BinaryNode("b",d,null);
            BinaryNode a=new BinaryNode("a",b,c);
            root=a;
        }
        public void preOrder(BinaryNode node) {
            list.add(node);
            if(node.left!=null) {
                preOrder(node.left);
            }
            if(node.right!=null) {
                preOrder(node.right);
            }
        }
        public void inOrder(BinaryNode node) {
            if(node.left!=null) {
                inOrder(node.left);
            }
            list.add(node);
            if(node.right!=null) {
                inOrder(node.right);
            }
        }
        public void postOrder(BinaryNode node) {
            if(node.left!=null) {
                postOrder(node.left);
            }
            if(node.right!=null) {
                postOrder(node.right);
            }
            list.add(node);
        }
        /**
         * 如果一颗树只有一个节点,深度是1;
         * 如果节点只有左子树没有右子树,那么树的深度是其左子树+1;
         * 如果节点只有右子树没有左子树,那么树的深度是其右子树+1;
         * 如果既有右子树也有左子树,就是其左右子树的较大值+1。
         */
        public int getTreeDepth(BinaryNode node) {
            if(node.left==null&&node.right==null) {
                return 1;
            }
            int left=0,right = 0;
            if(node.left!=null) {
                left=getTreeDepth(node.left);
            }
            if(node.right!=null) {
                right=getTreeDepth(node.right);
            }
            return right>left?right+1:left+1;
        }
        public static void main(String[] args) {
            BinaryTraversal bt1=new BinaryTraversal();
            System.out.println("第一个实例二叉树的根节点是:"+bt1.root.ele);
            System.out.println("第一个实例二叉树的深度是:"+bt1.getTreeDepth(bt1.root));
    
            System.out.println("循环中序遍历:");
            bt1.inOrder(bt1.root);
            for(BinaryNode node:bt1.getList()) {
                System.out.print(node.ele+" ");
            }
            
        }
    }

    (3)摘自李兴华老师的Java课程,对对象数组排序

    import java.util.Arrays;
    //完成两个功能:保存、取出
    //二叉排序树,中序遍历输出的元素有序
    class Person implements Comparable<Person>{
        //要实现对象数组的排序,必须实现所在类的Comparable<T>接口
        private String name;
        private int age;
        public Person(String name, int age) {
            this.name=name;
            this.age=age;
        }
        @Override
        public String toString() {
            return "姓名"+this.name+"年龄"+this.age;
        }
        @Override
        public int compareTo(Person p) {
            return this.age-p.age;
        }    
    }
    class BinaryTree2{
        private class Node{
            private Node left;
            private Node right;
            @SuppressWarnings("rawtypes")
            private Comparable data;
            @SuppressWarnings("rawtypes")
            public Node(Comparable data) {
                this.data =data;
            }
            @SuppressWarnings("unchecked")
            public void addNode(Node newNode) {
                if(this.data.compareTo(newNode.data)>0) {
                    //当前节点大于newNode,保存在左边
                    if(this.left==null) {
                        this.left=newNode;
                    }else {
                        this.left.addNode(newNode);
                    }
                }else {
                    if(this.right==null) {
                        this.right=newNode;
                    }else {
                        this.right.addNode(newNode);
                    }
                }
            }
            public void toArrayNode() {
                if(this.left!=null) {//有左节点
                    this.left.toArrayNode();
                }
                BinaryTree2.this.retData[BinaryTree2.this.foot++]=this.data;
                if(this.right!=null) {
                    this.right.toArrayNode();
                }
            }
        }
        private Node root;//保留住根节点
        private int count=0;//保存节点个数
        private Object[]retData;
        private int foot=0;
        @SuppressWarnings("rawtypes")
        public void add(Object obj) {
            Comparable data=(Comparable)obj;
            Node newNode=new Node(data);//将数据包装在Node节点之中
            if(this.root==null) {
                this.root=newNode;
            }else {
                this.root.addNode(newNode);
            }
            this.count++;
        }
        //取出数据,按中序遍历的方法
        public Object[]toArray(){
            if(this.count>0) {
                this.foot=0;
                this.retData=new Object[this.count];
                this.root.toArrayNode();
                return retData;
            }else {
                return null;
            }
        }
    }
    public class BuildBineryTreeLixh {
        public static void main(String[] args) {
            BinaryTree2 bt=new BinaryTree2();
            bt.add(new Person("wa",13));
            bt.add(new Person("xi",30));
            bt.add(new Person("li",8));
            System.out.println(Arrays.toString(bt.toArray()));
        }    
    }
  • 相关阅读:
    面试题: !=!=未看12 略多 sql语句练习 非常 有用
    面试题--阿里
    LeetCode--Count Primes
    (转载)协方差的意义
    LeetCode--Isomorphic Strings
    LeetCode--Reverse Linked List(Java)
    JDBC连接数据库的过程
    (转载)Java中如何遍历Map对象的4种方法
    Ubuntu下Eclipse中运行Hadoop程序的参数问题
    Hadoop上配置Hbase数据库
  • 原文地址:https://www.cnblogs.com/alatar16/p/7811377.html
Copyright © 2020-2023  润新知