一、二叉树的定义
一颗二叉树t是有限个元素的集合。当二叉树非空的时候,其中有一个元素称为根,余下的元素(如果有的话)被划分成两棵二叉树,分别称为t的左子树和右子树。
二叉树和树的根本区别:
- 二叉树的每个元素都恰好有两棵子树(其中一个或两棵可能为空)。而数的每个元素可以有任意数量的子树。
- 在二叉树中,每个元素的子树都是有序的,有左子树和右子树之分。树的子树是无序的。
二、二叉树的描述
二叉树最常用的表示方法是链式描述。每个元素用一个结点表示,结点有两个指针(引用)域,一个数据域。
private static class BinaryNode { //二叉树节点类
int element; //节点包含的 元素
BinaryNode left;//左孩子
BinaryNode right;//右孩子
BinaryNode(int element, BinaryNode left, BinaryNode right){
this.element = element;
this.left = left;
this.right = right;
}
BinaryNode(int element){
this(element,null,null);
}
}
- 从根节点开始,沿着left和right可以访问二叉树所有结点。一般没有由子节点指向父节点的指针,如有必要可自行加入。
三、二叉树的三种遍历方式的简要说明
每个节点的左子树在其右子树之前遍历。区别在于对每个节点的访问的时间不同。在前序遍历中,先访问一个结点,再访问该节点的左右子树;在中序遍历中,先访文一个节点的左子树,然后访问该节点,最后访问右子树。在后序遍历中,先访问一个节点的左右子树,再访问该节点
代码如下:
package main;
public class BinaryTree {
private static class BinaryNode { //二叉树节点类(内部类)
int element; //节点包含的 元素
BinaryNode left;//左孩子
BinaryNode right;//右孩子
BinaryNode(int element, BinaryNode left, BinaryNode right){
this.element = element;
this.left = left;
this.right = right;
}
BinaryNode(int element){
this(element,null,null);
}
}
private BinaryNode root;
private int size;
public BinaryTree(){
root = null;
size = 0;
}
public BinaryTree(int element){
root = new BinaryNode(element);
size = 1;
}
public void creatFullTree(){//手动建立一个完全二叉树,从上到下从左往右一次编号1~6
if(size == 0){
root = new BinaryNode(0);
return;
}
root.left = new BinaryNode(1);
root.right = new BinaryNode(2);
root.left.left = new BinaryNode(3);
root.left.right = new BinaryNode(4);
root.right.left = new BinaryNode(5);
root.right.right = new BinaryNode(6);
}
public void preOrder(BinaryNode p){
if(p != null) {
System.out.print(p.element + " ");
preOrder(p.left);
preOrder(p.right);
}
}
public void inOrder(BinaryNode p){
if(p != null) {
inOrder(p.left);
System.out.print(p.element + " ");
inOrder(p.right);
}
}
public void postOrder(BinaryNode p){
if(p != null) {
postOrder(p.left);
postOrder(p.right);
System.out.print(p.element + " ");
}
}
public BinaryNode getRoot(){
return this.root;
}
public static void main(String[] args) {
BinaryTree BTree = new BinaryTree(0);
BTree.creatFullTree();
System.out.print("二叉树先序遍历序列:");
BTree.preOrder(BTree.getRoot());
System.out.println();
System.out.print("二叉树中序遍历序列:");
BTree.inOrder(BTree.getRoot());
System.out.println();
System.out.print("二叉树后序遍历序列:");
BTree.postOrder(BTree.getRoot());
}
}
运行结果: