これは O(n) で実行できます。つまり、ツリーの各ノードに 1 回だけアクセスします。ロジックは次のとおりです。左右の 2 つの変数を保持 し、ゼロに初期化します。左側への再帰呼び出しがあるたびに、左に1 をインクリメントします。ライド側への再帰呼び出しがあるたびに、右に 1 をインクリメントします。
ルートから開始して、順番にトラバーサルを実行し、rightがゼロかどうかを確認します。これは、right を再帰的に呼び出したことがないことを意味します。yes がノードを出力する場合、これは tree のすべての左端のノードを出力していることを意味します。rightが 0 以外の場合、それらは境界とは見なされないため、リーフ ノードを探して出力します。
左サブツリーの呼び出しが完了した後の順序通りのトラバーサルでは、ルートまでバブルアップし、次に右サブツリーの再帰呼び出しを行います。最初にリーフノードをチェックして出力し、次にleftがゼロかどうかをチェックします。これは、 left を再帰的に呼び出したことを意味するため、境界とは見なされません。leftが 0 の出力ノードの場合、これは tree の右端のノードをすべて出力していることを意味します。
コードスニペットは
void btree::cirn(struct node * root,int left,int right)
{
if(root == NULL)
return;
if(root)
{
if(right==0)
{
cout<<root->key_value<<endl;
}
cirn(root->left,left+1,right);
if(root->left==NULL && root->right==NULL && right>0)
{
cout<<root->key_value<<endl;
}
cirn(root->right,left,right+1);
if(left==0)
{
if(right!=0)
{
cout<<root->key_value<<endl;
}
}
}
}