递归与二叉树

自己动手实现二叉树,特别注意这种树是有排序的,所以数据节点一定要是
Comparable 接口的子类才可以,这样方便排序
看代码之前,最好了解一下递归
推荐博文:http://www.jianshu.com/p/4db970d8ddc1
1,递归是局部的,只有调用的部分代码才会产生递归,递归下面的代码被称为剩余部分。
2,最后的一个递归执行完之后,会释放空间,同时标志着倒数第二个递归的递归部分代码执行完毕,继续执行剩余部分,以此类推,递归的正方向是描述、解决部分问题,反方向是解决剩余问题。
3,上面讲的是有递有归,有递无归相对简单,不做阐述
package bt;

import java.util.Arrays;

class BTree {

     //定义存储数据的节点
     class Node{
        //当前节点数据
        private Comparable data;
        //存储左节点
        private Node left;
        //存储右节点
        private Node right;
        //数据入口
        public Node(Comparable data){
            this.data = data;
        }

        @SuppressWarnings("unchecked")
        public void addNode(Node newNode){
            if(this.data == null){
                return;
            }
            //当前节点数据值大于新节点数据值
            if(this.data.compareTo(newNode.data) > 0){
            //左节点为空,数据存储在左节点
                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);
                }
            }
        }

        @SuppressWarnings("unchecked")
        public void toArrayNode(){
            if(this.left != null){
                this.left.toArrayNode();
            }
            BTree.this.retData[BTree.this.foot++] = this.data;
            if(this.right != null){
                this.right.toArrayNode();
            }
        }
    }
    //设立根结点,像这种数据结构必须有根
    private Node root;
    //计数
    private int count = 0;
    //脚标
    private int foot = 0;
    //存储返回值
    private Object []retData;
    //增加新节点
    public void add(Object data){
        if(data == null){
            return;
        }
        Node newNode = new Node((Comparable)data);

        //根节点为空,将当前节点作为根节点
        if(root == null){
            root = newNode;
        }else{
            root.addNode(newNode);
        }
        //计数
        count++;
    }

    public Object[] toArray(){
    //脚标清零,脚标不清零,第二次get内容的时候,会在原来的基础上增加数组长度,BTree.this.retData[BTree.this.foot++] = this.data;,会导致数据越界
         this.foot = 0;
         this.retData = new Object[this.count];
         this.root.toArrayNode();
         return this.retData;
    }
}

public class Test{
    public static void main(String[] args) {
        BTree bt = new BTree();
        bt.add(1);
        bt.add(2);
        bt.add(3);
        bt.add(7);
        bt.add(6);
        bt.add(0);
        System.out.println(Arrays.toString(bt.toArray()));
    }
}
运行结果
[0, 1, 2, 3, 6, 7]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值