【练习时间】2021/3/16
【题目名称】 求二叉树中值为x的结点的层号
【问题描述】
以二叉链表为存储结构,编写算法求二叉树中值为x的结点的层号。
【输入形式】两行,第一行是扩展二叉树的前序遍历序列,第二行是待查询结点x
【输出形式】值为x的结点所在层号。根结点所在层记为第1层。
【样例输入】
AB#D##C##
D
【样例输出】
3
【思路分析】
我们首先会考虑到如果一个节点是某一个节点的左子树或右子树上的节点,那么这个节点的层数应该是上一个节点层数+1;但是当我们编译实现的时候发现,根节点的左右子树的层数连接在一起,正常情况下应该是,左子树遍历完成后,转移到根节点的右子树的时候层数计数器归零。所以我们重新修改代码。
首先构造左右子树,并记录根节点的值,作为全局变量。
struct BiNode
{
char data;
BiNode *lchild;
BiNode *rchild;
};
BiNode *Creat()
{
BiNode *bt;
char ch;
cin>>ch;
if(ch=='#')return NULL;
else{
bt=new BiNode;
bt->data=ch;
if(root=='0')root=ch;
bt->lchild=Creat();
bt->rchild=Creat();
}
return bt;
}
接下来我们采用中序遍历的方法,将layer设置为全局变量,每向左子树遍历一次,layer++,同样的,向右子树遍历一次,layer++,但是,如果遍历的节点回到了根节点,那么layer重置为1;直到最终找到目标。
void MidOrder(BiNode *bt,char a)
{
if(bt==NULL)
{
layer--;
return;
}
else{
if(bt->data==a)
{
cout<<layer;
return;
}
layer++;
MidOrder(bt->lchild,a);
if(bt->data==root)layer=1;
layer++;
MidOrder(bt->rchild,a);
}
}
【源代码】
#include <iostream>
using namespace std;
int layer=1;
char root='0';
struct BiNode
{
char data;
BiNode *lchild;
BiNode *rchild;
};
BiNode *Creat()
{
BiNode *bt;
char ch;
cin>>ch;
if(ch=='#')return NULL;
else{
bt=new BiNode;
bt->data=ch;
if(root=='0')root=ch;
bt->lchild=Creat();
bt->rchild=Creat();
}
return bt;
}
void MidOrder(BiNode *bt,char a)
{
if(bt==NULL)
{
layer--;
return;
}
else{
if(bt->data==a)
{
cout<<layer;
return;
}
layer++;
MidOrder(bt->lchild,a);
if(bt->data==root)layer=1;
layer++;
MidOrder(bt->rchild,a);
}
}
int main()
{
BiNode *bt=Creat();
char a;
cin>>a;
MidOrder(bt,a);
return 0;
}