先来个定义:
二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。
有点抽象,类似的图像下面一样;实际上,是可以把树的概念与链表的概念结合起来的;可以想象一下,一个只有左节点或右节点的树,就是一个链表;因此,构建一棵树的
过程就有些像构建一个链表一样;大的在左边,小的在右边,每次插入一个新节点都要比较;
A
/ \
B C
/ \ / \
D E F G
/ \
H I
首先,同样的,一个节点类;要实现Comparable接口,便于比较
public class NodeTest {
public Object idata;// 数据
public NodeTest leftNode;//左节点,类似于链表中的next节点
public NodeTest rightNode;//右节点,
public String left;
public NodeTest(int idata){
this.idata = idata;
}
public void display(){
System.out.println(idata+" "+left);
}
}
树的实现,
public class TreeTest {
private static NodeTest root;
//插入一个节点,分为存在根节点,不存在根节点两种情况
public void insertNode(int idata) {
NodeTest inNode = new NodeTest(idata);
if (root == null) {
inNode.left="根";
root = inNode;
return;
} else {
NodeTest current = root;
NodeTest parent;
while (true) {
parent = current;
if (inNode.idata > current.idata) {
current = current.leftNode;
if (current == null) {
inNode.left="左";
parent.leftNode = inNode;
return;
}
} else {
current = current.rightNode;
if (current == null) {
inNode.left="右";
parent.rightNode = inNode;
return;
}
}
}
}
}
//遍历一棵树,不断遍历自己的左右节点,直到左或右节点为null;
public void show(NodeTest node) {
if(node!=null){
node.display();
show(node.leftNode);
show(node.rightNode);
}
}
public static void main(String[] args) {
TreeTest treeTest = new TreeTest();
treeTest.insertNode(1);
treeTest.insertNode(4);
treeTest.insertNode(2);
treeTest.insertNode(11);
treeTest.insertNode(6);
treeTest.show(root);
}
}