数据结构——二叉树的链式存储的实现-CSDN博客
数据结构 树和二叉树 算法习题1-8_Xiao_Ya__的博客-CSDN博客
//先序遍历(递归)
void PreOrder(BiTree T){
if(T!=NULL){
if(T->data!='#')//访问当前节点
printf("%c ",T->data);
PreOrder(T->lchild);//遍历左子树
PreOrder(T->rchild);//遍历右子树
}
}
//先序遍历(非递归)
void PreOrder2(BiTree T){
Stack S=(Stack)malloc(sizeof(struct stack));
Initstack(S);
BiTree p=T;
while(p||!isEmpty(S)){
if(p){
printf("%c ",p->data);
push(S,p);
p=p->lchild;
}
else{
pop(S,p);
p=p->rchild;
}
}
free(S);
}
//中序遍历(递归)
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);//遍历左子树
if(T->data!='#')//访问当前节点
printf("%c ",T->data);
InOrder(T->rchild);//遍历右子树
}
}
//中序遍历(非递归)
void InOrder2(BiTree T){
Stack S=(Stack)malloc(sizeof(struct stack));
Initstack(S);
BiTree p=T;
while(p||!isEmpty(S)){
if(p){
push(S,p);
p=p->lchild;
}
else{
pop(S,p);
printf("%c ",p->data);
p=p->rchild;
}
}
free(S);
}
//后序遍历
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);//遍历左子树
PostOrder(T->rchild);//遍历右子树
if(T->data!='#')//访问当前节点
printf("%c ",T->data);
}
}
//后序遍历(非递归)
void PostOrder2(BiTree T){
Stack S=(Stack)malloc(sizeof(struct stack));
Initstack(S);
BiTree p=T;
BiTree r=NULL;
while(p||!isEmpty(S)){
if(p){
push(S,p);
p=p->lchild;
}
else{
GetTop(S,p);
if(p->rchild&&p->rchild!=r)
p=p->rchild;
else{
pop(S,p);
printf("%c ",p->data);
r=p;
p=NULL;
}
}
}
free(S);
}
#include
#include
//定义树节点
typedef struct BiNode{
char data;//数据域
//指针域,分别指向左孩子和右孩子
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
//定义栈节点
typedef struct stack{
BiTree data;//栈顶数据域是指向树节点的指针;
struct stack *next;
}stack,*Stack;
//初始化栈
bool Initstack(Stack &S){
S->next=NULL;
return true;
}
//入栈
bool push(Stack &S,BiTree p){
Stack q=(Stack)malloc(sizeof(struct stack));
q->data=p;
q->next=S->next;
S->next=q;
return true;
}
//出栈
bool pop(Stack &S,BiTree &p){
if(S->next==NULL) return false;
Stack q=S->next;
S->next=q->next;
p=q->data;
free(q);
return true;
}
//访问栈顶元素
bool GetTop(Stack &S,BiTree &p){
if(S->next==NULL) return false;
Stack q=S->next;
p=q->data;
return true;
}
//判断是否为空栈
bool isEmpty(Stack S){
if(S->next==NULL) return true;
else return false;
}
//创建一棵树,先序创建
void CreateTree(BiTree &T){
char ch;//存放输入值
scanf("%c\n",&ch);
if(ch=='#')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=ch;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
//先序遍历(递归)
void PreOrder(BiTree T){
if(T!=NULL){
if(T->data!='#')//访问当前节点
printf("%c ",T->data);
PreOrder(T->lchild);//遍历左子树
PreOrder(T->rchild);//遍历右子树
}
}
//先序遍历(非递归)
void PreOrder2(BiTree T){
Stack S=(Stack)malloc(sizeof(struct stack));
Initstack(S);
BiTree p=T;
while(p||!isEmpty(S)){
if(p){
printf("%c ",p->data);
push(S,p);
p=p->lchild;
}
else{
pop(S,p);
p=p->rchild;
}
}
free(S);
}
//中序遍历(递归)
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);//遍历左子树
if(T->data!='#')//访问当前节点
printf("%c ",T->data);
InOrder(T->rchild);//遍历右子树
}
}
//中序遍历(非递归)
void InOrder2(BiTree T){
Stack S=(Stack)malloc(sizeof(struct stack));
Initstack(S);
BiTree p=T;
while(p||!isEmpty(S)){
if(p){
push(S,p);
p=p->lchild;
}
else{
pop(S,p);
printf("%c ",p->data);
p=p->rchild;
}
}
free(S);
}
//后序遍历
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);//遍历左子树
PostOrder(T->rchild);//遍历右子树
if(T->data!='#')//访问当前节点
printf("%c ",T->data);
}
}
//后序遍历(非递归)
void PostOrder2(BiTree T){
Stack S=(Stack)malloc(sizeof(struct stack));
Initstack(S);
BiTree p=T;
BiTree r=NULL;
while(p||!isEmpty(S)){
if(p){
push(S,p);
p=p->lchild;
}
else{
GetTop(S,p);
if(p->rchild&&p->rchild!=r)
p=p->rchild;
else{
pop(S,p);
printf("%c ",p->data);
r=p;
p=NULL;
}
}
}
free(S);
}
int main(){
BiTree T;
CreateTree(T);
printf("先序遍历: ");
PreOrder(T);
printf("\n中序遍历: ");
InOrder(T);
printf("\n后序遍历: ");
PostOrder(T);
printf("\n非递归先序遍历:");
PreOrder2(T);
printf("\n非递归中序遍历:");
InOrder2(T);
printf("\n非递归后序遍历:");
PostOrder2(T);
return 0;
}
12#46###3#5###
先序遍历: 1 2 4 6 3 5
中序遍历: 2 6 4 1 3 5
后序遍历: 6 4 2 5 3 1
非递归先序遍历:1 2 4 6 3 5
非递归中序遍历:2 6 4 1 3 5
非递归后序遍历:6 4 2 5 3 1
--------------------------------
Process exited after 12.82 seconds with return value 0
请按任意键继续. . .