二叉树算法题整理(四)

大学生资料站,一个面向大学生的资源共享平台
在这里插入图片描述

题目一

写出在中序线索二叉树中结点p的右子树中插入一个结点s的算法

代码

void insert(BiThrNode p,BiThrNode s)
{
	BiThrNode *p,*s;
	if(p->rtag==1)			//无右子树,则有右线索
	{
		s->rchild=p->rchild;
		s->rtag=1;
		p->rchild=s;
		p->rtag=0;
	}
	else
	{
		q=p->rchild;
		while(q->ltag==0)//查找p所指结点中序后继,即右子树中最左下的结点
			q=q->lchild;
		q->lchild=p->rchild;
		s->rtag=0;
		p->rchild=s;
	}
	s->lchild=p;
	s->ltag=1;
}

题目二

给出二叉树自下而上,从右到左的层次遍历算法

思想

就是利用了原有的层次遍历算法,将所有遍历的结点入栈,然后弹栈。利用了栈颠倒次序的特点
原有的层次遍历算法是自上而下、从左到右,这里遍历算法恰恰相反。利用原有的层次遍历算法,出队的同时将各节点指针入栈,在所有结点入栈后再从栈顶开始一次访问
具体实现
1、根结点入队
2、一个元素出队列,遍历元素
3、依次把这个元素的右孩子、左孩子入队
4、若队列不空调到2,否则结束

代码

void InvertLevel(BiTree bt){
	Stack s;
	Queue Q;
	if(bt!=null)
	{
		InitStack(s);		//初始化栈,栈中存放二叉树结点的指针
		InitQueue(Q);
		EnQueue(Q,bt);
		while(IsEmpty(Q)==false){
			DeQueue(Q,p);
			Push(s,p);			//出队入栈
			if(p->lchild)
				EnQueue(Q,p->lchild);		//左不空,入队
			if(p->rchild)
				EnQueue(Q,p->rchild);
		}
		while(Isempty(s)==false){
			Pop(s,p);
			visit(p->data);
		}
	}
}


#define MAX_NODE 50
void levelorderTraverse(BTNode *T)
{
//基础层次遍历
	BTNode *Queue[MAX_NODE],*p=T;
	int front=0,rear=0;
	if(T==NULL)
		printf("Empty");
	else{
		Queue[++rear]=p;
		while(front<rear){
			p=Queue[++front];
			visit(p->data);
			if(p->Lchild!=NULL)
				Queue[++rear]=p->Lchild;
			if(p->Rchild!=NULL)
				Queue[++rear]=p->Rchild;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值