二叉排序树定义
两个叉,有排序,的树。
- 每个结点最多只有两个子节点。
- 有序。左节点<根节点<右节点。
手写二叉排序树
结点类
public class Node {
public int id; // 结点值
public Node leftNode; // 左结点
public Node rightNode;// 右结点
// 初始化节点的值
public Node(int id) {
this.id = id;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", leftNode=" + leftNode +
", rightNode=" + rightNode +
'}';
}
}
试着输出下单个结点:
public static void main(String[] args) {
Node node = new Node(2);
System.out.println(node);
}
输出如下:Node{id=2, leftNode=null, rightNode=null}
二叉排序树新增结点
给定一个数组[2,1,4,3,6],将数据元素插入至二叉排序树中:
- 初始化根结点
- 和中间结点比较,小于中间结点在左边,大于中间结点在右边
- 如果左右结点为空,则直接放置,否则,接着往下找到合适的位置放置为止。
public class BinarySortTree {
public static void main(String[] args) {
// 1. 初始化二叉树
int[] arr = {2, 1, 4, 3, 6};
Node node = new Node(arr[0]); // 初始化根节点
for (int i = 1; i < arr.length; i++) {
insertNode(node, arr[i]);
}
System.out.println(node);
}
public static void insertNode(Node node, int num) {
if (node == null) {
return;
}
// 判断传入值和节点值大小关系,小于往左,大于往右
if (num < node.id) {
if (node.leftNode == null) {
node.leftNode = new Node(num);
} else {
insertNode(node.leftNode, num);
}
}
if (num > node.id) {
if (node.rightNode == null) {
node.rightNode = new Node(num);
} else {
insertNode(node.rightNode, num);
}
}
}
}
输出结果如下:
Node{id=2, leftNode=Node{id=1, leftNode=null, rightNode=null}, rightNode=Node{id=4, leftNode=Node{id=3, leftNode=null, rightNode=null}, rightNode=Node{id=6, leftNode=null, rightNode=null}}}
二叉排序树遍历
前中后指中间结点位置
- 前序遍历:中左右(2,1,4,3,6)和插入顺序一致
- 中序遍历:左中右(1,2,3,4,6)
- 后序遍历:左右中(1,3,6,4,2)
public class BinarySortTree {
public static void main(String[] args) {
// 1. 初始化二叉树
int[] arr = {2, 1, 4, 3, 6};
Node node = new Node(arr[0]); // 初始化根节点
for (int i = 1; i < arr.length; i++) {
insertNode(node, arr[i]);
}
System.out.println(node);
System.out.println("==== 二叉排序树前序遍历 ====");
preorder(node);
System.out.println("==== 二叉排序树中序遍历 ====");
middleOrder(node);
System.out.println("==== 二叉排序树后序遍历 ====");
postOrder(node);
}
public static void insertNode(Node node, int num) {
if (node == null) {
return;
}
// 判断传入值和节点值大小关系,小于往左,大于往右
if (num < node.id) {
if (node.leftNode == null) {
node.leftNode = new Node(num);
} else {
insertNode(node.leftNode, num);
}
}
if (num > node.id) {
if (node.rightNode == null) {
node.rightNode = new Node(num);
} else {
insertNode(node.rightNode, num);
}
}
}
// 中 左 右
public static void preorder(Node node) {
if (node == null) {
return;
}
System.out.println(node.id); // 输出当前结点
if (node.leftNode != null) {
preorder(node.leftNode);
}
if (node.rightNode != null) {
preorder(node.rightNode);
}
}
// 左 中 右
public static void middleOrder(Node node) {
if (node == null) {
return;
}
if (node.leftNode != null) {
middleOrder(node.leftNode);
}
System.out.println(node.id);
if (node.rightNode != null) {
middleOrder(node.rightNode);
}
}
// 左 右 中
public static void postOrder(Node node) {
if (node == null) {
return;
}
if (node.leftNode != null) {
postOrder(node.leftNode);
}
if (node.rightNode != null) {
postOrder(node.rightNode);
}
System.out.println(node.id);
}
}
输出如下: