求二叉树中值为x的结点的层号

【问题描述】
以二叉链表为存储结构,编写算法求二叉树中值为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);
}

在下是一名小白 如果有不恰当的地方 欢迎指正

发布了31 篇原创文章 · 获赞 8 · 访问量 2156

猜你喜欢

转载自blog.csdn.net/weixin_44034024/article/details/104894734