【问题描述】
以二叉链表为存储结构,编写算法求二叉树中值为x的结点的层号。
【输入形式】两行,第一行是扩展二叉树的前序遍历序列,第二行是待查询结点x
【输出形式】值为x的结点所在层号。根结点所在层记为第1层。
【样例输入】AB#D##C##
D
【样例输出】
3
分析:
1.构建二叉树 结点
2.输入结点数值
3.遍历记录层数
4.判断 输出结果
构建二叉树 结点
template <typename DataType>
struct BiNode
{
DataType data;
BiNode<DataType>*lchild,*rchild;
};
template<typename DataType>
class BiTree
{
public:
BiTree()
{
root=Create();
}
int LevelNum(DataType x)
{
return LevelNum(root,1,x);//这里level初始化为1
}
private:
BiNode<DataType>*Create();
int LevelNum(BiNode<DataType>*bt,int level,DataType x);
BiNode<DataType>*root;
};
输入结点数值
template<typename DataType>
BiNode<DataType>*BiTree<DataType>::Create()
{
BiNode<DataType>*bt;
char ch;
cin>>ch;
if(ch=='#')
bt=NULL;
else
{
bt=new BiNode<DataType>;
bt->data=ch;
bt->lchild=Create();
bt->rchild=Create();
}
return bt;
}
遍历记录层数
int BiTree<DataType>::LevelNum(BiNode<DataType>*bt,int level,DataType x)
{
if(bt==NULL)//两种情况 树为空 或者 未找到 x
return 0;
else
{
if(bt->data==x)//找到x 返回层数
return level;
else
{
int l1=0;
l1=LevelNum(bt->lchild,level+1,x);//利用递归 继续寻找左子树 注意层数要增加
if(l1!=0)
return l1;
else
{
int l2=0;
l2=LevelNum(bt->rchild,level+1,x);//利用递归 继续寻找右子树 注意层数要增加
if(l2!=0)
return l2;
else
return 0;//最后没找到 返回0
}
}
}
}
主函数
int main()
{
BiTree<char>t1;
char x;
cin>>x;
cout<<t1.LevelNum(x);
}
在下是一名小白 如果有不恰当的地方 欢迎指正