因为二叉树的定义就是递归的, 所以二叉树、创建、销毁和各种遍历操作都使用递归的方法,会比较好理解。递归其实主要运用到了系统工作栈, 因此可以使用递归实现的,借助用户栈一般也可以实现, 本文中三种遍历方法都使用递归和循环两种方法实现。也可以使用队列来进行层序遍历。由此可见,队列和栈是两种很基础的工具,应该熟练掌握其使用方法。
本文中的各种函数都可以输入不同二叉树来测试,唯一麻烦的一点的是输入树时需要一个结点一个结点的输入, 为了便于一次测试所有函数,队列和栈都使用到了,但不幸的是,楼主实现的队列和栈的一些函数有冲突,又懒得修改名字,因此只能当成C++来编译。linux 下可以使用G++编译, 下面上代码。
//树的相关头文件
//bintree.h
#include <stdio.h>
#include "Stack.h"
#include "queue.h"
typedef struct Node
{
char ch;
struct Node * lchild;
struct Node * rchild;
}Node;
typedef Node * BtreePointer;
//v : root , l: leftchild, r: rightchild, c: recycle
BtreePointer create(void);
void show_vlr(BtreePointer pbt);//先序递归
void show_lvr(BtreePointer pbt);//中序递归
void show_lrv(BtreePointer pbt);//后序递归
void show_vlr_c(BtreePointer pbt);//先序循环
void show_lvr_c(BtreePointer pbt);//中序循环
void show_lrv_c(BtreePointer pbt);//后序循环循环
void show_level(BtreePointer pbt);//层序遍历
void destory(BtreePointer pbt);
//实现
//bintree.c
#include "bintree.h"
//这个创建树的函数需要交互输入, 有点麻烦,但是可以建立所有二叉树
//一开始输入根节点, 接着输入左子树、右子树,依次类推,# 表示对应子树为空
BtreePointer create(void)
{
BtreePointer pnode;
char temp;
temp = getchar();
getchar();//skip /n
if(temp == '#')
return NULL;
pnode = (BtreePointer)malloc(sizeof(Node));
if(pnode == NULL)
{
return NULL;
}
pnode->ch = temp;
printf("Enter left child data (# to NULL): ");
pnode->lchild = create();
printf("Enter right child data(# to NULL): ");
pnode->rchild = create();
return pnode;
}
void show_vlr( BtreePointer pbt)//递归
{
if(pbt == NULL)
return;
printf("%c", pbt->ch);
show_vlr(pbt->lchild);
show_vlr(pbt->rchild);
}
void show_lvr( BtreePointer pbt)//递归
{
if(pbt)
{
show_lvr(pbt->lchild);
printf("%c", pbt->ch);
show_lvr(pbt->rchild);
}
}
void show_lrv(BtreePointer pbt)
{
if(pbt)
{
show_lrv(pbt->lchild