二叉树(非递归)

建树

BinTree CreateBinTree_NRecursion()//输入对应的补全的完全二叉树的层序遍历 
{
	queue<BinTree> q;//空队列
	BinTreeNode * s,* p,* bt;//bt为根节点,s为当前节点,p为队首节点 
	char ch;
	int cnt=-1; 
	cin>>ch;
	bt=NULL;
	while(ch!='#')//输入以#终止 
	{
		s=NULL;
		if(ch!='@')
		{
			s=(BinTree)malloc(sizeof(BinTreeNode));//申请新节点
			s->data=ch;
			s->leftchild=s->rightchild=NULL; 
		}
		//现在,如果当前节点是虚节点,那么s就是NULL,否则s指向当前节点 
		q.push(s);//节点指针入队 
		cnt++;//计数器++ 
		if(cnt==0)//如果进来的是第一个节点 
		{
			bt=s;//根节点 
		}
		else//不是根节点 
		{
			p=q.front();//取队首节点 
			if(s!=NULL&&p!=NULL)//因为输入和进队是同时的,当前队首节点尚未处理完成,进来的节点s要么是左孩子要么是右孩子 
			{//输入的是树的层序,类似BFS 
				if(cnt%2==1)//进来的节点左右孩子交替 
				{
					p->leftchild=s;
				}
				else
				{
					p->rightchild=s;
				}
			} 
			
			if(cnt%2==0)//表明已经处理完左右孩子 
			{
				q.pop();//弹出队列 
			}		
		}		
		cin>>ch;
	}
	return bt;
} 

先序遍历 版本1

void PreOrder_NRecursion1(BinTree bt)//出栈时访问节点,根据栈先进后出,右孩子,左孩子入栈 
{
	stack<BinTree> astack;
	BinTreeNode * p;
	astack.push(bt);
	while(!astack.empty())
	{
		p=astack.top();
		astack.pop();
		cout<<p->data<<" ";
		if(p->rightchild!=NULL)
		{
			astack.push(p->rightchild);
		}
		if(p->leftchild!=NULL)
		{
			astack.push(p->leftchild);
		}
	}
}

先序遍历 版本2

void PreOrder_NRecursion2(BinTree bt)//沿着左支深入,经过一个节点就访问,不入栈,同时将右孩子入栈 
{
	stack<BinTree> astack;
	BinTreeNode * p=bt;
	if(bt==NULL)
	{
		return;
	}
	
	astack.push(bt);//根节点入栈 
	while(!astack.empty())//栈非空 
	{
		p=astack.top();//取顶 
		astack.pop();//弹出 
		while(p!=NULL)
		{
			cout<<p->data<<" ";
			if(p->rightchild!=NULL)
			{
				astack.push(p->rightchild);//右孩子入栈 
			}
			p=p->leftchild;//沿左支深入 
		}
	}
} 

中序遍历

void InOrder_NRecursion(BinTree bt)
{
	stack<BinTree> astack;
	BinTree p;
	p=bt;
	if(p==NULL)
	{
		return;
	}
	
	astack.push(bt);
	p=p->leftchild;
	while(p||!astack.empty())
	{
		while(p!=NULL)//沿着左支深入直至NULL 
		{
			astack.push(p);
			p=p->leftchild;
		}
		
		p=astack.top();//逐个弹出,访问 
		astack.pop();
		cout<<p->data<<" "; 
		p=p->rightchild;//进入右支,下次的大循环,就在右支中向左深入 
	}
}

后序遍历

void PostOrder_NRecursion(BinTree bt) 
{
	BinTree p=bt;
	stack<BinTree> astack;
	if(bt==NULL)
	{
		return ;
	}
	
	while(p!=NULL||!astack.empty())
	{
		while(p!=NULL)
		{
			astack.push(p);
			p=p->leftchild?p->leftchild:p->rightchild;//如果左孩子非空,移向左孩子,否则移向右孩子 
		}
		//此处已到达最底层 
		p=astack.top();
		astack.pop();
		cout<<p->data<<" ";
		
		if(!astack.empty()&&(astack.top()->leftchild==p))//如果栈非空,并且刚刚访问的节点是左孩子 
		{
			p=astack.top()->rightchild;//移向右孩子,下次大循环就开始寻找这个节点最底层 
		}
		else//如果是右孩子,说明左孩子在上次就被处理 
		{
			p=NULL;//p赋为空,这样下次大循环中的第一个循环被掠过,相当于返回了上一层 
		}
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值