数据结构——树与二叉树

第五章 树与二叉树

一、本章节其它相关的文章

数据结构——二叉树的链式存储的实现-CSDN博客

数据结构 树和二叉树 算法习题1-8_Xiao_Ya__的博客-CSDN博客

二、树与二叉树的遍历

1.先序遍历二叉树图解:

二叉树的先序遍历(递归算法):

//先序遍历(递归) 
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);
}

2.中序遍历二叉树图解:

 二叉树的中序遍历(递归算法):

//中序遍历(递归)
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); 
}

3.后序遍历二叉树图解:

二叉树的后序遍历(递归算法): 

//后序遍历
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<stdio.h>
#include<stdlib.h>
//定义树节点
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
请按任意键继续. . .

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值