二叉树习题整理(三)

题目一

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

思想

根据完全二叉树的定义,具有n个结点的完全二叉树与满二叉树中编号从1~n的结点对应。采用层次遍历算法,所有结点加入队列,遇到空节点的时候看其后面是否还有非空结点,若有则不是完全二叉树

代码

Status T649(BiTree T)
{
	int i,j;
	BiTree p[100]={};				//数指针数组,模拟队列
	int order[100]={};
	i=j=0;
	if(T)
	{
		p[j]=T;
		order[j]=1;					//遍历的同时为结点编号
		j++;
		while(i<j)
		{
			if(i>0&&order[i]>order[i-1]+1)
				return ERROR;		//若结点序号不连续,则非完全二叉树
			if(p[i]->lchild)
			{
				p[j]=p[i]->lchild;
				order[j]=2*order[i]+1;
				j++;
			}
			if(p[i]->rchild)
			{
				p[j]=p[i]->rchild;
				order[j]=2*order[i]+1;
				j++
			}
			i++;
		}
	}
	return OK;
}


bool IsComplete(BiTree T){
	InitQueue(Q);
	if(!T)
		return 1;			//空树为满二叉树
	EnQueue(Q,T);
	while(!IsEmpty(Q)){
		DeQueue(Q,p);
		if(p){
		//结点非空,将其左右子树入队列
			EnQueue(Q,p->lchild);
			EnQueue(Q,p->rchild);
		}
		else
			while(!IsEmpty(Q)){
				DeQueue(Q,p);
				if(p)
					return 0;
			}
	}
	return 1;
}
	
			

题目二

已知二叉树采用二叉链表存储,设计一个算法求二叉树中指定结点所在的层数

思想

我自己的思想是可以用求二叉树深度的思想求,深度即层数。
子树的深度(求树的深度的思路:
1、如果树为空,则深度为0
2、如果树不是空,那么深度是左子树的深度+1或右子树的深度+1)

代码

int nodelevel(BTNode *bt,int x)
{
	if(bt==NULL)
		return 0;
	else if(bt->data==x)
		return 1;
	else
	{
		int a=nodelevel(bt->left,x);
		if(a>=1)
			return a+1;
		int b=nodelevel(bt->right,x);
		if(b>=1)
			return b+1;
		else
			return 0;
	}
}

int BiTreedepth(BiTree p){
//自己思想的代码
	int n1,n2;
	if(p==NULL)
		return 0;
	else{
		n1=BiTreedepth(p->lchild);
		n2=BiTreedepth(p->rchild);
		if(n1>n2)
			return n1+1;
		else
			return n2+1;
	}
}

题目三

已知二叉排序树采用二叉链表存储,试写一高校算法从小到大输出二叉排序树中所有小于X的结点的数据

思路

由二叉排序树的性质可知,中序遍历为递增序列,用中序遍历非递归算法高效
,利用栈完成
中序:1、左侧全部入栈;2、当全部入栈时,设循环结束;3、否则出栈,访问,p指向右孩子

代码

#define MAX_NODE 50
void InorderSearch(BTNode *T,int x)
{
	if(T!=NULL)
	{
		BTNode *Stack[MAX_NODE];
		int top=-1;
		BTNode *p=T;
		while(top!=-1||p!=NULL)
		{
			while(p!=NULL)
			{
				Stack[top++]=p;				//左侧全部入栈
				p=p->lchild;
			}
			if(top!=-1)						//当全部出栈,循环结束
			{
				p=Stack[top--];
				visit(p);
				if(p->data<x)
					printf("d",p->data);
				p=p->rchild;
			}
		}
	}
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值