#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define ElemType char//元素类型
#define STACK_INIT_SIZE 100
#define _br_ printf("\n")
typedef char TElemType;
/*
* \param 二叉树
* \author Silent_Amour
*/
typedef struct BiTNode {
ElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
typedef struct {
BiTree *base;
BiTree *top;
int Size;
} Stack;
int initStack(Stack &S)
{
S.base = (BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
if (!S.base)exit(-1);
S.top = S.base;
S.Size = STACK_INIT_SIZE;
return 1;
}
int StackPop(Stack &S, BiTree &e)
{
if (!S.top || S.top == S.base)
return -1;
e = *--S.top;
// printf("出栈%d,%d\n", S.top, e);
return 1;
}
int StackPush(Stack &S, BiTree e)
{
if (S.top-S.base>= S.Size)
exit(-1);
*S.top++ = e;
// printf("进栈%d,地址:%d\n", S.top, e);
return 1;
}
int DisplayElem(TElemType e)
{
printf("%c ", e);
return 1;
}
int creatBiTree(BiTree &T)
{
char ch;
ch=getchar();
if (ch == '.')
T = NULL;
else
{
if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))
exit(-1);
T->data = ch;
creatBiTree(T->lchild);
creatBiTree(T->rchild);
}
return 1;
}
int PreOrderTraverse(BiTree T, int(*DisplayElem)(TElemType e))
{
if (T) {
if (DisplayElem(T->data))
if (PreOrderTraverse(T->lchild, DisplayElem))
if (PreOrderTraverse(T->rchild, DisplayElem))
return 1;
return -1;
} else
return 1;
}
int InOrderTraverse(BiTree T, int(*DisplayElem)(TElemType e))
{
if (T) {
if (InOrderTraverse(T->lchild, DisplayElem))
if (DisplayElem(T->data))
if (InOrderTraverse(T->rchild, DisplayElem))
return 1;
return -1;
} else return 1;
}
int PostOrderTraverse(BiTree T, int(*DisplayElem)(TElemType e))
{
if (T) {
if (PostOrderTraverse(T->lchild, DisplayElem))
if (PostOrderTraverse(T->rchild, DisplayElem))
if (DisplayElem(T->data))
return 1;
return -1;
} else return 1;
}
int InOrderTraverse_Stack(BiTree T, int(*DisplayElem)(TElemType e))
{
BiTree p = T;
BiTree s[100];
int top=-1;
while (p||top!=-1) {
while (p) {
s[++top]=p;
p = p->lchild;
}
if(top!=-1) {
p=s[top--];
if (!DisplayElem(p->data))return -1;
p = p->rchild;
}
}
return 1;
}
void InOrderUnrec(BiTree t)
{
Stack s;
initStack(s);
BiTree p=t;
while (p!=NULL || s.top!=s.base) {
while (p!=NULL) {
StackPush(s,p);
p=p->lchild;
}
if (s.top!=s.base) {
StackPop(s,p);
DisplayElem(p->data);
p=p->rchild;
}
}
}
void PreOrderUnrec(BiTree t)
{
Stack s;
initStack(s);
BiTree p=t;
while (p!=NULL || s.top!=s.base) {
while (p!=NULL) {
DisplayElem(p->data);
StackPush(s,p);
p=p->lchild;
}
if (s.top!=s.base) {
//访问根结点
StackPop(s,p);
p=p->rchild;
}
}
}
int Depth(BiTree t)
{
int ld=0,rd=0;
BiTree s=t;
if(!t)
return 0;
if(t) {
ld=Depth(s->lchild);
rd=Depth(s->rchild);
}
if(ld>=rd)
return ld+1;
return rd+1;
}
void disp_leaf(BiTree t)
{
BiTNode *p=t;
if(p)
{
if(p->lchild==NULL&&p->rchild==NULL)
printf("%c ",p->data);
disp_leaf(p->lchild);
disp_leaf(p->rchild);
}
}
int main()
{
BiTree S;
creatBiTree(S);
printf("递归先序遍历:\n");
PreOrderTraverse(S, DisplayElem);
_br_;
printf("递归中序遍历:\n");
InOrderTraverse(S, DisplayElem);
_br_;
printf("递归后序遍历:\n");
PostOrderTraverse(S, DisplayElem);
_br_;
printf("非递归中序遍历(小堆栈):\n");
InOrderTraverse_Stack(S, DisplayElem);
_br_;
printf("非递归中序遍历(标准堆栈):\n");
InOrderUnrec(S);
_br_;
printf("非递归先序遍历(标准堆栈):\n");
PreOrderUnrec(S);
_br_;
printf("深度:%d",Depth(S));
_br_;
printf("所有的叶子节点为:\n");
disp_leaf(S);
free(S);
return 0;
}
二叉树,递归、非递归遍历,求深度,输出叶子节点
最新推荐文章于 2021-12-05 12:34:26 发布