[数据结构]树和二叉树习题

🌳一:

给定二叉树的两种遍历序列,分别是: 前序遍历序列:D,A,C,E,B,H,F,G,I; 中序遍历序列:D,C,B,E,H,A,G,I,F,
试画出二叉树B。

在这里插入图片描述

🌳二、

已知一棵有2011个结点的树,其叶结点个数为116,该树对应的二叉树中无右孩子的结点个数是

在这里插入图片描述
链接

🌳三、

编写按层次顺序(同一层自左至右)遍历二叉树的算法。

思路:
1、使用队列,从根结点开始,将根结点入队
2、判断队头元素是否有左孩子,若有,将左孩子入队;判断队头元素是否有右孩子,若有,将右孩子入队
3、队头元素出队
4、重复2和3,直到队列为空

出队顺序即为层序遍历

string LevelOrder(BiTree T){
	Queue Q;
	InitQueue(Q);
	string res="";
	BiTree temp;  //用来保存出队结点
	if(T){    //如果二叉树非空
		EnQueue(Q,T);
		while(!QueueEmpty(Q)){
			DeQueue(Q,temp);
			res+=temp->data;
			if(temp->lchild){
				EnQueue(Q,temp->lchild);
			}
			if(temp->rchild){
				EnQueue(Q,temp->rchild);
			}
		}
		return res;
	}
	return "";
}	

🌳四、

编写算法判别给定二叉树是否为完全二叉树。

思路:

根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的层次遍历,应该满足一下两条要求:

  • 某节点没有左孩子,则一定无右孩子
  • 若某节点缺左或右孩子,则其所有后继一定无孩子

若不满足上述任何一条,均不为完全二叉树。

bj变量值表示迄今为止所有节点均有左右孩子(其初值为1),一旦发现一个节点没有左孩子或没有右孩子时置bj为0)

int IsCompleteTree(BiTree T){
	Queue Q;
	InitQueue(Q);
	int bj=1;
	BiTree temp;  //用来保存出队结点
	if(T){  //如果二叉树非空
		EnQueue(Q,T);
		while(!QueueEmpty(Q)){
			DeQueue(Q,temp);
			if(temp->lchild==NULL){  //没有左孩子
				bj=0;
				if(temp->rchild!=NULL)  //有右孩子
					return 0;  //则不满足完全二叉树第一个要求
				}
			}
			else{  //有左孩子
				if(bj==1){  //迄今为止,所有节点均有左右孩子
					EnQueue(Q,temp->lchild);  //左孩子入队
					if(temp->rchild==NULL){  //没有右孩子
						bj=0;
					}
					else{  //有右孩子
						EnQueue(Q,temp->rchild);
					}
				}
			}
				else
					return 0;
			}
		}
	}
	return 1;
}		
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心星人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值