• 数据结构之二叉树的使用技巧(一)


    经常看到有些人写关于二叉树的一些博客,说了很多概念,然后建立二叉树那块的方法真是让我拙计啊,看到好多人是这样建立的,代码大概是这样:

    public class BinaryTree {
    	int data;
    	BinaryTree left;
    	BinaryTree right;
    	public BinaryTree(int d,BinaryTree l,BinaryTree r){
    		data=d;
    		left=l;
    		right=r;
    	}
    	//其它遍历方法之类的。。。不再重复
    	public static void main(String[] args) {
    		//每次建立一个节点,然后其它的节点与以前的节点进行关联
    		BinaryTree bt1=new BinaryTree(1,null,null);
    		BinaryTree bt2=new BinaryTree(2,bt1,null);
    		BinaryTree bt5=new BinaryTree(5,null,null);
    		BinaryTree bt4=new BinaryTree(4,null,bt5);
    		BinaryTree root=new BinaryTree(3,bt2,bt4);
    	}
    
    }
    
    

    第二种方法:上边那种太蛋疼了,写下个人建立的方法,这种写法使用了Java中的方法调用链,可以很准确的控制每个节点的左右子树,而且很直观,缺点就是如果数据量大了还是不方便

    public static class BTNode {
            public BTNode left, right;
            public int data;
    
            public BTNode(int d){
                data=d;
                left=null;
                right=null;
            }
            public BTNode getLeft() {
                return left;
            }
    
            public BTNode setLeft(BTNode left) {
                this.left = left;
                return this;
            }
    
            public BTNode getRight() {
                return right;
            }
    
            public BTNode setRight(BTNode right) {
                this.right = right;
                return this;
            }
    
            public int getData() {
                return data;
            }
    
            public BTNode setData(int data) {
                this.data = data;
                return this;
            }
    
            public void printNode() {
                System.out.print(data+"	");
            }
            public static void main(String[] args) {
                //构建一个二叉树
                BTNode root=new BTNode(10);
                root.setLeft(new BTNode(5)
                                .setLeft(new BTNode(7))
                               .setRight(new BTNode(8)))
                    .setRight(new BTNode(10)
                               .setLeft(new BTNode(1)
                                          .setRight(new BTNode(3)))
                              .setRight(new BTNode(2)));
           }
    }
    

    这种方法还有建立二叉排序树的方法,用这种方法建立的二叉树在中序遍历时,打印出来的是经过排序的数字:

    public class BinarySortTree {
        // 二叉树的跟节点
        private BTNode root = null;
    
        /** 添加节点 */
        public BinarySortTree addNode(int n) {
            if (root == null) {
                root=new BTNode(n);
            }
            addNode(root,n);
            return this;
        }
    
        private void addNode(BTNode node,int n){
            if(n<node.getData()){
                if(node.getLeft()==null) node.setLeft(new BTNode(n));
                else addNode(node.getLeft(),n);
            }else{
                if(node.getRight()==null) node.setRight(new BTNode(n));
                else addNode(node.getRight(),n);
            }
        }
        /**
         * 得到二叉树的跟节点引用
         */
        public BTNode getRoot() {
            return root;
        }
        /**
         * 中序遍历
         */
        public void inOrderVisit(){
            visit1(root);
        }
        
        /**中序遍历*/
        private void visit1(BTNode root){
            if(null!=root){
                visit1(root.getLeft());
                root.printNode();
                visit1(root.getRight());
            }
        }
        public static void main(String[] args) {
            BinarySortTree b=new BinarySortTree();
            b.addNode(7).addNode(4).addNode(18).addNode(2)
            .addNode(3).addNode(5);
            b.inOrderVisit();
        }
    
        /**
         * 二叉树的节点,抽象层次不同,包含左右子节点和跟的值
         */
        public static class BTNode {
            public BTNode left, right;
            public int data;
    
            public BTNode(int d){
                data=d;
                left=null;
                right=null;
            }
            public BTNode getLeft() {
                return left;
            }
    
            public BTNode setLeft(BTNode left) {
                this.left = left;
                return this;
            }
    
            public BTNode getRight() {
                return right;
            }
    
            public BTNode setRight(BTNode right) {
                this.right = right;
                return this;
            }
    
            public int getData() {
                return data;
            }
    
            public BTNode setData(int data) {
                this.data = data;
                return this;
            }
    
            public void printNode() {
                System.out.print(data+"	");
            }
        }
    }
    

    上边的代码中的遍历二叉树的方法可以再写简单一点,可以更简略的类似函数式编程的思想写为如下:

     1 public void inOrderVisit1(){
     2         new Object(){
     3             void visit(BTNode root){
     4                 if(null!=root){
     5                     visit(root.getLeft());
     6                     root.printNode();
     7                     visit(root.getRight());
     8                 }
     9             }
    10         }.visit(getRoot());
    11 }

    最后归纳一下,其实熟练掌握数据结构还是在编程中很重要的,而且可以java语言特有的语言特性,在二叉树中可以玩出很多新的花样,比如:

    1.如何按照层次来遍历一个二叉树?

    2.如何按照层次来构建一个二叉树?

  • 相关阅读:
    Java集合源码分析(一)
    EffectiveJava——请不要在代码中使用原生态类型
    Dubbo初探
    EffectiveJava——用函数对象表示策略
    EffectiveJava——类层次优于标签类
    notebook1.md
    NoteBook学习(二)-------- Zeppelin简介与安装
    Spark2.0学习(三)--------核心API
    Spark2.0学习(二)--------RDD详解
    Spark2.0学习(一)--------Spark简介
  • 原文地址:https://www.cnblogs.com/Lowp/p/3379222.html
Copyright © 2020-2023  润新知