[問題の説明]
バイナリリンクリストをストレージ構造として、値が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);
}
以下は少し白いですが、不適切な箇所がある場合は修正してください。