自己动手实现二叉树,特别注意这种树是有排序的,所以数据节点一定要是
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]
递归与二叉树
最新推荐文章于 2022-04-23 13:46:36 发布