二叉树的存储结构与遍历

二叉树的顺序存储

#difine MaxSize 100
struct TreeNode
{
	int data;//结电值 
	bool isEmpty;//结点是否为空 
 } ;

适合完全二叉树,若不是完全二叉树,也要把树中节点与完全二叉树对应
i的
左孩子 2i;
右孩子:2i+1
父节点:i/2向下取整
2
i<n 有左孩子

二叉树的链式存储

typedef struct BiTNode
 {
 	int data;
 	struct BiNode *lchild,*rchild;
 }BiTNode,*BiTree;
 //定义一颗空树 
 BiTree root=Null;
 //插入根节点
 root =(BiTree)mizeof(sizeof(BiTNode));
 root->data=1;
 root->lchild=NULL;
 root->rchild=Null;
 

先序遍历

void PreOrder(BiTree T)
 {
 	if(T!=NULL)
 	{
 		visit(T);
 		PreOrder(T->lchild);
 		PreOrder(T->rchild);
 		
	}
 }
 

中序(LNR)

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);
 		
	}
 }

中序遍历的非递归形式

 //思想:一直向左走,走到空出栈并访问,若有右孩子入栈,若没有出栈并访问 
 void InOrder(BiTree T)
 {
 	InitStack(S)//初始化栈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 InOrder(BiTree T)
 {
 	InitStack(S)//初始化栈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 PostOrder(BiTree T)
{
	BiTree p=T,r=NULL;
	InitStack(S);
	while(p||IsEmpty(S)){
		if(p) 
		{
			Push(S,p);
			p=p->lchild;
		}
		else
		{
			GetTop(S,p);//读取栈顶元素 
			if(p->rchild&p->rchild!=r)//P有右子树且右子树未被访问 
			{
				p-p->rchild;
			}
			else
			{
				Pop(S,p);
				visit(p);
				r=p;//记录最近访问过的节点 
				p=NULL;
			 } 
		}
	}
}

层次遍历

void LevelOrder(BiTree T)
{
	InitQueue(q);//初始化队列
	BiTree p=T;
	Push(q,p);
	while(IsEmpty(q))
	{
		Pop(q,p);
		visit(p);
		if(p->lchild) Push(q,p->lchild);
		if(p->rchild) Push(q,p->rchild);
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值