バイナリツリーでxの値を持つノードの層番号を見つける

[問題の説明]
バイナリリンクリストをストレージ構造として、値がxであるノードのレイヤー番号をバイナリツリーで見つけるアルゴリズムを記述します。

【入力形式】2行目、1行目は拡張二分木の前順探索シーケンス、2行目は問い合わせるノードx
【出力形式】値がxのノード番号 ルートノードが配置されているレイヤーが最初のレイヤーとして記録されます。
[入力例] 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