二叉树
二叉树由各种节点组成
二叉树特点:
每个节点都可以有左子节点,右子节点
每一个节点都有一个值
二叉树排序
假设通过二叉树对如下10个随机数进行排序
67,7,30,73,10,0,78,81,10,74
排序的第一个步骤是把数据插入到该二叉树中,插入基本逻辑是,小、相同的放左边,大的放右边
- 67 放在根节点
- 7 比 67小,放在67的左节点
- 30 比67 小,找到67的左节点7,30比7大,就放在7的右节点
- 73 比67大, 放在67得右节点
- 10 比 67小,找到67的左节点7,10比7大,找到7的右节点30,10比30小,放在30的左节点。 … …
- 10比67小,找到67的左节点7,10比7大,找到7的右节点30,10比30小,找到30的左节点10,10和10一样大,放在左边
遍历二叉树
通过上一个步骤的插入行为,实际上,数据就已经排好序了。 接下来要做的是看,把这些已经排好序的数据,遍历成我们常用的List或者数组的形式
二叉树的遍历分先序,中序,后序
先序即: 先遍历根节点,再依次遍历左子树,右子树
中序即: 先遍历左子树,再依次遍历根节点,右子树
后序即: 先遍历左右子树,再遍历根节点
参考代码
package review5;
import java.util.ArrayList;
import java.util.List;
public class Node {
public Node leftNode;
public Node rightNode;
public int value;
public void add(int v) {
// 当前节点为空
if(value == 0) {
value = v;
}
//当前节点不为空
else {
//插入值小于等于当前节点值,放到二叉树左边
if(v <= value) {
//左子树为空
if(leftNode == null) {
leftNode = new Node();
}
leftNode.add(v);
}
//插入值大于等于当前节点值,放到二叉树右边
else {
if(rightNode == null) {
rightNode = new Node();
}
rightNode.add(v);
}
}
}
public List<Integer> values(){
//中序遍历
List<Integer> values = new ArrayList<>();
//遍历左子树
if(leftNode != null) {
values.addAll(leftNode.values());
}
//当前节点
values.add(value);
//遍历右子树
if (rightNode != null) {
values.addAll(rightNode.values());
}
return values;
}
public static void main(String[] args) {
int[] a = new int[10];
for(int i = 0; i < 10; i++) {
a[i] = (int) (Math.random()*100+1);
}
Node root = new Node();
for(int num : a) {
root.add(num);
System.out.print(num+",");
}
System.out.println();
System.out.println(root.values());
}
}