题目一
编写算法判别给定二叉树是否为完全二叉树
思想
根据完全二叉树的定义,具有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;
}
}
}
}