数据结构-树与二叉树的递归与非递归遍历

一、二叉树的存储 (顺序和链式)

//二叉树的顺序存储 
#define Maxsize 100
struct  TreeNode{
	ElemType value;   //存放结点中的数据元素
	bool isEmpty;      //结点是否为空 
};
struct TreeNode t[Maxsize];
//初始化
void Init()
{
	for(int i=0;i<Maxsize;i++)
	{
		t[i].isEmpty=true;
	}
 } 
 
//二叉树的链式存储
struct  ElemType{
	int value;
};
typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; 

//定义一棵空树 
BiTree root=NULL

//插入根结点
root=(BiTree)malloc(sizeof(BiTNode));
root->data={1};
root->lchild=NULL;
root->rchild=NULL; 

//插入新的结点
BiTNode *p=(BiTNode *)malloc(sizeof(BiTNode));
p->data={2};
p->lchild=NULL;
p->rchild=NNULL;
root->lchild=p; 

二、二叉树的遍历 

typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

2.1递归方法

//先序遍历
void PreOrder(BiTree T)
{
	if(T!=NULL)
	{
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
 } 
 
 //中序遍历
void InOrder(BiTree T)
{
	if(T!=NULL)
	{
		InOrder(T->lchild);
		visit(T);
		InOrder(T->rchild);
	}
 } 
 
 //后序遍历
 void PostOrder(BiTree T)
{
	if(T!=NULL)
	{
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		visit(T);
	}
 }

2.2 非递归方法 

//先序遍历 
 void PreOrder(BiTree T)
 {
 	InitStack(S);
 	BiTree p=T;
 	while(p||!isEmpty(S))
 	{
 		if(p)
 		{
 			visit(p);
 			push(S,p);
 			p=p->lchild;
		}
 		else
 		{
 			pop(S,p);
 			p=p->rchild;
		}
	}
  } 

 //中序遍历 
 void InOrder(BiTree T)
 {
 	InitStack(S);
 	BiTree p=T;
 	while(p||!isEmpty(S))
 	{
 		if(p)
 		{
 			push(S,p);
 			p=p->lchild;
		}
 		else
 		{
 			pop(S,p);
 			visit(p); 
 			p=p->rchild;
		}
	}
  } 
  
//后序遍历
 void PostOrder(BiTree T)
 {
 	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);
				visit(p->data);
				r=p;
				p=NULL;          //结点访问完,重置p指针 
			}
		}	
	}
  }  

后序遍历的一个基本应用:求树的深度

 //求树的深度
 int Depth(BiTree T)
 {
 	if(T==NULL)
 	{
		return 0;
	}
	else
	{
		int l=Depth(T->lchild);
		int r=Depth(T->rchild);
		return l>r? l+1:r+1;
	}
}  

2.3 层次遍历 

//二叉树的结点(链式存储) 
typedef struct BiTNode{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//链式队列结点 
typedef struct LinkNode{
	BiTNode *data;       //存放的是指针而不是结点 
	struct LinkNode *next;
}LinkNode; 

typedef struct{
	LinkNode *rear ,*front;	
}LinkQueue;

//层序遍历
void levelOrder(BiTree T)
{
	InitQueue(Q);
	BiTree p;
	EnQueue(Q,T);
	while(!IsEmpty(Q))
	{
		DeQueue(Q,p);   //队头结点出队 
		visit(p);       //访问队头结点 
		if(p->lchild!=NULL)   //左孩子不空,左孩子入队 
		EnQueue(p->lchild);
		if(p->rchild!=NULL)   //有孩子不空,右孩子入队 
		EnQueue(p->rchild);
	}
 } 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小阿丁呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值