树的创建
树有很多创建方式,本文采用二叉链表的创建方法
二叉树的三种遍历方法
前序遍历
规则是若二叉树为空,则空操作~否则先访间根结点,然后前序遍历左子树,再前序遍历右子树。上图所示树前序遍历结果为:ABDHKECFIG
public void preOrder(node p) {
System.out.print(p.data+" ");
if (p.lchild!=null) {
preOrder(p.lchild);
}
if(p.rchild!=null) {
preOrder(p.rchild);
}
}
中序遍历
规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。上图所示树中序遍历结果为:HKDBEAIFCGJ
public void inOrder(node p) {
if (p.lchild!=null) {
inOrder(p.lchild);
}
System.out.print(p.data+" ");
if(p.rchild!=null) {
inOrder(p.rchild);
}
}
后序遍历
规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。上图所示树后序遍历结果为:KHDEBIFJGCA
public void postOrder(node p) {
if (p.lchild!=null) {
postOrder(p.lchild);
}
if(p.rchild!=null) {
postOrder(p.rchild);
}
System.out.print(p.data+" ");
}
代码实现
代码
class node{
char data;
node lchild;
node rchild;
node(char x){
data = x;
}
}
public class Tree{
//前序遍历
public void preOrder(node p) {
System.out.print(p.data+" ");
if (p.lchild!=null) {
preOrder(p.lchild);
}
if(p.rchild!=null) {
preOrder(p.rchild);
}
}
//中序遍历
public void inOrder(node p) {
if (p.lchild!=null) {
inOrder(p.lchild);
}
System.out.print(p.data+" ");
if(p.rchild!=null) {
inOrder(p.rchild);
}
}
//后序遍历
public void postOrder(node p) {
if (p.lchild!=null) {
postOrder(p.lchild);
}
if(p.rchild!=null) {
postOrder(p.rchild);
}
System.out.print(p.data+" ");
}
public static void main(String[] args) {
//创建树
node a = new node('A');
a.lchild = new node('B');
a.rchild = new node('C');
node b = a.lchild;
b.lchild = new node('D');
b.rchild = new node('E');
node c = a.rchild;
c.lchild = new node('F');
c.rchild = new node('G');
node d = b.lchild;
d.lchild = new node('H');
node f =c.lchild;
node g = c.rchild;
f.lchild = new node('I');
g.rchild = new node('J');
node h = d.lchild;
h.rchild = new node('K');
Tree tree = new Tree();
System.out.print("前序遍历:");
tree.preOrder(a);
System.out.println();
System.out.print("中序遍历:");
tree.inOrder(a);
System.out.println();
System.out.print("后序遍历:");
tree.postOrder(a);
}
}