每一个内心仰望理想的人,都在低头干活
摘要
顾名思义,二叉搜索树是由两个孩子节点组成的树状的数据结构,由于其特殊的性质,任意一个节点的左子树的每个节点总比这个节点小,右子树的每个节点总比这个节点大,所以二叉搜索树的查询性能比较好。
本文只讲解二叉搜索树,二叉平衡树不是本文重点
正文
不得不承认,递归思想在二叉树中展现的淋漓尽致,本文讲解的二叉搜索树主要操作如下:
-
插入节点
-
先序遍历
-
中序遍历
-
后续遍历
-
层序遍历
-
求最小节点
-
求最大节点
-
搜索
-
求子节点的父节点
-
求最大深度
-
求树的节点个数
-
求叶子节点个数
-
返回深度从1-deepth的节点总个数
-
返回深度为deepth的节点个数
-
返回第level层节点个数
-
返回中序遍历的后继节点
-
删除节点
其中,删除节点的操作最为复杂,大家一定要多理解。
节点类型
class Node{
//值域
public int value;
//左孩子
public Node left;
//右孩子
public Node right;
public Node(int value){
this.value = value;
this.left = null;
this.right = null;
}
}
插入节点
根据二叉搜索树的性质,如果node.value<root.value,则向左递归,否则向右递归,所以代码如下
public void insertNode(Node root,Node node){
if(root == null){
root = new Node(node.value);
return;
}
Node x = root;
Node p = x; //表示node要插入p后
while(x != null){
p = x;
if(node.value < x.value){
x = x.left; //向左
}else if(node.value > x.value){
x = x.right; //向右
}else{
return;
}
}
if(node.value < p.value){
p.left = new Node(node.value);
}else{
p.right = new Node(node.value);
}
}
前序、中序、后续遍历
先序:根-->左-->右
中序:左-->根-->右
后续:左-->右-->根
/**
* 先序遍历
* @param node
*/
public void preOrderTraval(Node node){
if(node == null)
return;
System.out.print(node.value+",");
preOrderTraval(node.left);
preOrderTraval(node.right);
}
/**
* 中序遍历
* @param root
*/
public void inOrderTravel(Node root){
if(root