1.二叉树由各种节点组成
每个节点都可以有左子节点,右子节点
每一个节点都有一个值
2.排序
二叉树的遍历分左序,中序,右序
左序即: 中间的数遍历后放在左边
中序即: 中间的数遍历后放在中间
右序即: 中间的数遍历后放在右边
如图所见,我们希望遍历后的结果是从小到大的,所以应该采用中序遍历
3.比较冒泡法,选择法以及二叉树排序的性能区别
4.结构图
5.MyNode
public class MyNode {
private Integer value;//当前值;
private MyNode leftNode;//左叶子节点;
private MyNode rightNode;//右叶子节点;
public MyNode() {
//super();
}
public MyNode(int value, MyNode leftNode, MyNode rightNode) {
//super();
this.value = value;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
//添加元素
public void addNode(int nValue){
if(null == value){
value = nValue;//当前节点没有值则放入数据到该节点中
return;
}
if((value - nValue) >= 0){//当前节点大于等于待插入的值,需放入其左侧节点
if(null == leftNode){//左侧叶子节点为null则设置该元素为左侧叶子节点
leftNode = new MyNode(nValue,null,null);
return;
}
leftNode.addNode(nValue);//存在左侧叶子节点则便利插入:
}else{//当前节点小于待插入的值,需放入其右侧节点
if(null == rightNode){//右侧叶子节点为null则设置该元素为右侧叶子节点
rightNode = new MyNode(nValue,null,null);
return;
}
rightNode.addNode(nValue);
}
}
//中序便利
public List<MyNode> sortByCenter(){
List<MyNode> list = new ArrayList<MyNode>();
//存放左侧的节点,当前节点,右侧节点
if(null != leftNode){
list.addAll(leftNode.sortByCenter());
}
list.add(this);
if(null != rightNode){
list.addAll(rightNode.sortByCenter());
}
return list;
}
}
6.TwoTree
/**
* 二叉树
* @author dada
*
*/
public class TwoTree {
private MyNode top;//头节点;
private int size;//二叉树的总数据个数;
public TwoTree() {
top = new MyNode();
size = 0;
}
/**
* 添加元素到二叉树中
* @param nValue
*/
public void addNodeToTree(int nValue){//添加节点到二叉树中
top.addNode(nValue);
size ++;
}
/**
* 返回二叉树的元素个数
* @return
*/
public int size(){//获取二叉树的元素个数
return size;
}
/**
* 中序便利二叉树:左侧节点-当前节点-右侧节点
* @return
*/
public List<MyNode> sortByCenterTree(){
return top.sortByCenter();
}
/**
* 返回二叉树的头节点
* @return
*/
public MyNode getTop(){
return top;
}
}
7.NodeMain
public class NodeMain {
public static void main(String[] args) {
//初始化二叉树;
TwoTree tree = new TwoTree();
//添加元素到二叉树中:
int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74, 10 };
for (int number : randoms) {
tree.addNodeToTree(number);
}
//中序便利二叉树
List<MyNode> listNode = tree.sortByCenterTree();
for (MyNode myNode : listNode) {
System.out.print(myNode.getValue()+",");
}
System.out.println();
//获取头节点
MyNode top = tree.getTop();
System.out.println("二叉树头节点的值为:"+top.getValue()+",二叉树元素个数为:"+tree.size());
}}
8.输出结果
0,7,10,10,10,30,67,73,74,78,81,
二叉树头节点的值为:67,二叉树元素个数为:11