二叉树
二叉树是一棵树,其中每个节点都不能有多于两个的儿子。如下图显示一颗由一个根和两颗子树组成的二叉树,左子树和右子树均可能为空。
二叉树的实现
因为一个二叉树节点最多有两个子节点,所以我们可以保存直接链接到它们的链。树节点的声明在结构上类似于双链表的声明,在声明中,节点就是由element(元素)的信息加上两个到其他节点的引用(left和right)组成的结构。具体实现的代码如下:
private class Node{
private int element;//存放数据
private Node left;//左节点
private Node right;//右节点
}
二叉树的遍历
二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。下面我们主要研究下先序、中序、后序遍历,这三种遍历方式其实指的是父节点被访问的次序。
- 先序遍历(preOrder):若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历。
public void preOrder(){
System.out.print(this.data+"->");
if(this.left!=null){
this.left.preOrder();
}
if(this.right!=null){
this.right.preOrder();
}
}
- 中序遍历(inOrder):在遍历时,父节点被访问的次序位于左右孩子节点之间,就是中序遍历。
public void inOrder(){
if(this.left!=null){
this.left.inOrder();
}
System.out.print(this.data+"->");
if(this.right!=null){
this.right.inOrder();
}
}
- 后序遍历(postOrder):在遍历时,访问完左右孩子节点之后再访问父节点,就是后序遍历。
public void postOrder(){
if(this.left!=null){
this.left.postOrder();
}
if(this.right!=null){
this.right.postOrder();
}
System.out.print(this.data+"->");
}
二叉查找树
-
二叉查找树的定义
二叉查找树是一种特殊的二叉树,它在二叉树的基础上增加了一个特点,就是每个节点比它左子树的节点值都要大,而比右子树的节点值都要小,因此它也被称为二叉排序树。 -
二叉查找树的性质
(1)若它的左子树非空,则左子树上所有节点的值均小于根节点的值;
(2)若它的右子树非空,则右子树上所有节点的值均大于根节点的值;
(3)左右子树本身又各是一颗二叉查找树;
(4)按中序遍历二叉查找树,所得到的的中序遍历序列是一个递增有序序列。 -
二叉查找树的实现
package 数据结构;
public class BinaryTree {
private Node root;//根节点
//内部类 节点
private class Node{
private int data;//存放数据
private Node left;//左节点
private Node right;//右节点
public Node(int data){
this.data=data;
}
//增加新节点
public void addNode(int data){
//数据小于根节点 放在左边
if(data<=this.data){
//判断左节点是否为空 为空新增 不为空递归
if(this.left==null){
this.left=new Node(data);
}else{
this.left.addNode(data);
}
}else{
//数据大于根节点 放在右边
if(data>this.data){
if(this.right==null){
this.right=new Node(data);
}else{
this.right.addNode(data);
}
}
}
}
//先序遍历
public void preOrder(){
System.out.print(this.data+"->");
if(this.left!=null){
this.left.preOrder();
}
if(this.right!=null){
this.right.preOrder();
}
}
//中序遍历
public void inOrder(){
if(this.left!=null){
this.left.inOrder();
}
System.out.print(this.data+"->");
if(this.right!=null){
this.right.inOrder();
}
}
//后序遍历
public void postOrder(){
if(this.left!=null){
this.left.postOrder();
}
if(this.right!=null){
this.right.postOrder();
}
System.out.print(this.data+"->");
}
//二叉查找树最小值的递归实现
private Node findMin(Node t){
if(t==null){
return null;
}else if(t.left==null){
return t;
}
return findMin(t.left);
}
//二叉查找树最大值的非递归实现
private Node findMax(Node t){
if(t!=null){
while(t.right!=null){
t=t.right;
}
}
return t;
}
}
//判断是否增加新节点
public void add(int data){
if(root==null){
root=new Node(data);
}else{
root.addNode(data);
}
}
public void print(){
root.preOrder();
System.out.println();
root.inOrder();
System.out.println();
root.postOrder();
}
}