二叉树由节点(Node)组成,每个节点包含一个“左”指针(left)、“右”指针(right)和一个数据元素(e)。
“根”(root)指针指向树中最顶端的节点。左右指针递归地指向较小的
两边的“子树”。空指针表示没有元素的二叉树——空树。正式的递归定义是:二叉树要么为空(由空指针表示),要么由单个节点构成,
其中左指针和右指针(前面是递归定义)都指向一个二叉树。
上图是一棵二分搜索树(BST):
二分搜索树是二叉树
二分搜索树的每个节点的值都大于其左子树的所有节点的值,小于其右子树的所有节点的值(1,3,4)<5
其中(1,4,6)是树的叶子节点,因为其节点的left和right指针是空子树。
由于二分搜索树具有元素之间比较的特点,所以二分搜索树存储的元素类型应该要具有可比较性。可以为二分搜索树添加泛型E,并且E extends Comparable
这里我的二分搜索树存储的元素类型就指定为int,且其他方法都用递归实现
public class BST {
private class Node {
int e;
Node left;
Node right;
public Node(int e) {
this.e = e;
left = null;
right = null;
}
}
private Node root;
private int size;
public BST() {
this.root = null;
this.size = 0;
}
}
查找方法:
public boolean lookup(Node node,int target){
//最基本的情况:空树,找不到目标,所以返回false
if (node == null)
return false;
//如果不为空,则根据值来判断
else {
if (target == node.e)
return true;
else {
if (target < node.e)
return lookup(node.left,target);
else return lookup(node.right,target);
}
}
}
插入元素方法:
public void insert(int data){
root = insert(root,data);
}
private Node insert(Node node,int data){
//如果节点是空的,则返回一个新的节点,值为data
if (node == null){
size++;
return new Node(data);
}
//如果节点不为空,则根据data和e对比
else {
if (data < node.e) node.left = insert(node.left,data);
else node.right = insert(node.right,data);
return node;
}
}
getSize方法:
public int getSize(){
return size;
}
获取树的最大深度方法:
public int maxDepth(){
return maxDepth(root);
}
private int maxDepth(Node node){
if (node == null)
return 0;
else {
int lDepth = maxDepth(node.left);
int rDepth = maxDepth(node.right);
return Math.max(lDepth,rDepth)+1;
}
}
先序遍历、中序遍历、后序遍历:
public void preOrder(){
preOrder(root);
}
private void preOrder(Node node){
if (node == null)
return;
System.out.println(node.e);
preOrder(node.left);
preOrder(node.right);
}
public void inOrder(){
inOrder(root);
}
private void inOrder(Node node){
if (node==null)
return;
inOrder(node.left);
System.out.println(node.e);
inOrder(node.right);
}
public void postOrder(){
postOrder(root);
}
private void postOrder(Node node){
if (node==null)
return;
postOrder(node.left);
postOrder(node.right);
System.out.println(node.e);
}