本章内容:树的结构定义、递归的三种遍历、非递归的三种遍历、层次遍历、求深度、求特定结点以及测试的主函数。
#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
//二叉树的链式存储
typedef struct BTNode
{
//树结点存储的类型可以更换,常用int、double、char等
int data;
BTNode *lchild;
BTNode *rchild;
}BTNode,*Tree;
//访问改结点数值
void visit(Tree Q)
{
printf("%d\n",Q->data);
}
//先序遍历
void preorder(Tree Q)
{
if(Q!=NULL)
{
visit(Q);
preorder(Q->lchild);
preorder(Q->rchild);
}
}
//中序遍历
void midorder(Tree Q)
{
if(Q!=NULL)
{
midorder(Q->lchild);
visit(Q);
midorder(Q->rchild);
}
}
//后序遍历
void postorder(Tree Q)
{
if(Q!=NULL)
{
postorder(Q->lchild);
postorder(Q->rchild);
visit(Q);
}
}
//求高度
int getDepth(Tree Q)
{
if(Q==NULL)
return 0;
else
{
int l,r;
l=getDepth(Q->lchild);
r=getDepth(Q->rchild);
return (l>r?l:r)+1;
}
}
//查找符合key的结点,存放到w中
void search(Tree Q,Tree &w,int key)
{
if(Q!=NULL)
{
if(Q->data==key)
{
w=Q;
}
else
{
search(Q->lchild, w, key);
//剪枝操作
if(w!=NULL)
search(Q->rchild, w, key);
}
}
return;
}
//层次遍历
void level(Tree Q)
{
int front,rear;
Tree l[maxsize];
Tree q;
front=rear=0;
if(Q!=NULL)
{
//初始先把根结点放入
rear=(rear+1)%maxsize;
l[rear]=Q;
//循环访问
while(front!=rear)
{
front=(front+1)%maxsize;
q=l[front];
visit(q);
if(q->lchild!=NULL)
{
rear=(rear+1)%maxsize;
l[rear]=q->lchild;
}
if(q->rchild!=NULL)
{
rear=(rear+1)%maxsize;
l[rear]=q->rchild;
}
}
}
}
//非递归设计遍历,先
void Npreorder(Tree Q)
{
if(Q!=NULL)
{
Tree Stack[maxsize];
int top=-1;
Tree q;
Stack[++top]=Q;
while(top!=-1)
{
q=Stack[top--];
visit(q);
if(q->rchild!=NULL)
Stack[++top]=q->rchild;
if(q->lchild!=NULL)
Stack[++top]=q->lchild;
}
}
}
//非递归设计遍历,中
void Nmidorder(Tree Q)
{
if(Q!=NULL)
{
Tree q;
Tree Stack[maxsize];
int top=-1;
q=Q;
while(top!=-1||q!=NULL)
{
//左孩子存在,则存此刻结点再往下找做孩子
while(q!=NULL)
{
Stack[++top]=q;
q=q->lchild;
}
if(top!=-1)
{
q=Stack[top--];
visit(q);
q=q->rchild;
}
}
}
}
//非递归设计遍历,后
void Npostorder(Tree Q)
{
if(Q!=NULL)
{
Tree Stack1[maxsize];
int top1=-1;
Tree Stack2[maxsize];
int top2=-1;
Tree q=NULL;
Stack1[++top1]=Q;
//将所有结点都放进来
while(top1!=-1)
{
q=Stack1[top1--];
Stack2[++top2]=q;
if(q->lchild!=NULL)
Stack1[++top1]=q->lchild;
if(q->rchild!=NULL)
Stack1[++top1]=q->rchild;
}
//输出结点
while (top2!=-1)
{
q=Stack2[top2--];
visit(q);
}
}
}
int main()
{
//随便写一个树
Tree head,A,B,C,D,E;
head=(Tree)malloc(sizeof(BTNode));
A=(Tree)malloc(sizeof(BTNode));
B=(Tree)malloc(sizeof(BTNode));
C=(Tree)malloc(sizeof(BTNode));
D=(Tree)malloc(sizeof(BTNode));
E=(Tree)malloc(sizeof(BTNode));
head->data=0;
A->data=1;
B->data=2;
C->data=3;
D->data=4;
E->data=5;
head->lchild=A;
head->rchild=B;
A->lchild=C;
A->rchild=D;
B->lchild=E;
B->rchild=NULL;
C->lchild=D->lchild=E->lchild=C->rchild=D->rchild=E->rchild=NULL;
//三种遍历
//preorder(head);
//midorder(head);
//postorder(head);
//获得深度
//printf("%d",getDepth(head));
//层次遍历
//level(head);
//三种非递归遍历
//Npreorder(head);
//Nmidorder(head);
//Npostorder(head);
return 0;
}