🌳一:
给定二叉树的两种遍历序列,分别是: 前序遍历序列: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;
}