再帰的アルゴリズムは、バイナリツリーのすべてのリーフノードを削除します
バイナリツリーが空の場合、NULLが返されます。
バイナリツリーにノードが1つしか
ない場合は、直接削除します。それ以外の場合、左と右のサブツリーは再帰的です。
void Del(BiTNode *&t)
{
if(t==NULL) return;
if(t->lcild==NULL&&t->rchild==NULL)
{
delete t;
t=NULL;
}
else
{
Del(t->lchild);
Del(t->rchild);
}
}
二分木の各ノード要素の最大値の再帰的アルゴリズム
maxを事前設定された最大値、初期値は0とし、それより大きい値があるかどうかを判断して変更します。
void MaxValue(BiTNode *t,DataType &max)
{
if(t!=NULL)
{
if(t->data>max)
{
max=t->data;
}
MaxValue(t->lchild,max);
MaxValue(t->rchild,max);
}
}
再帰ステートメントでは、最大値は関数パラメーターテーブルによって返されるため、maxは参照パラメーターです。
再帰的アルゴリズムは、二分木の左と右の子を交換します
最初に左と右のサブツリーを再帰的に交換し、最後にルートの左と右の子を交換します
void exchange(BiTNode *t)
{
if(t==NULL) return;
exchange(t->lchild);
exchange(t->rchild);
BiTNode *p;
p=t->lchild;
t->lchild=t->rchild;
t->child=p;
}
プリオーダーシーケンスとミッドオーダーシーケンスからバイナリツリーを作成
プレシーケンスシーケンスpre [s1、…、t2]、ミッドシーケンスシーケンスを[s2、…、t2]、最初はs1 = s2 = 0、t1 = t2 = n、pre [s1]でルートノードを確立、検索[s1] = pre [s1]の位置iは、中間シーケンスを[s2、... i-1]と[i + 1、... t2]の2つのサブシーケンスに分割し、再帰的に左右のサブツリーを構築します。
void createBiTree(BiTNode *t,DataType pre[], DataType in[], int s1,int s2,int t1,int t2)
{//pre存放前序序列,in存放中序序列
int i;
t = (BiTNode*)malloc(sizeof(BiTNode));
t->data = pre[s1]; //前序序列的第一个元素一定是根节点
for(i=s2; i<t2; i++)
{
if(in[i]==pre[s1])
break;
}
//使用递归,分别插入左子树和右子树
createBiTree(t->lchild,pre,in,s1+1,s1+i-s2,s2,i-1);
createBiTree(t->rchild,pre,in,s1+i-s2+1,t1,i+1,t2);
}
シーケンスシーケンスとシーケンスシーケンスからバイナリツリーを作成する
プリオーダーシーケンスとミッドオーダーシーケンスからバイナリツリーを構築するのと似ていますが、ルートノードはポスト[t1]であり、ポストオーダーシーケンスの最後のビットです。
void createBiTree(BiTNode *t,DataType post[], DataType in[], int s1,int s2,int t1,int t2)
{
int i;
t = (BiTNode*)malloc(sizeof(BiTNode));
t->data = post[t1]; //后序序列的最后一个元素一定是根节点
for(i=s2; i<t2; i++)
{
if(in[i]==post[t1])
break;
}
//使用递归,分别插入左子树和右子树
createBiTree(t->lchild,pre,in,s1+i-s2,t1-1,i+1,t2);
createBiTree(t->rchild,pre,in,s1,s1+i-s2-1,s2,i-1);
}
preorder traversalを使用して、preorder traversalのk番目のノードを検索します
カウンターのカウントに参加し、訪問中にノード番号を記録します
BiTNode* Pre_Find_k(BiTNode t,int &count,int k)
{
if(t!==NULL)
{
count++;
if(count==k) return t;
BiTNode *p;
p=(BiTNode*)malloc(sizeof(BiTNode));
if((p=Pre_Find_k(t->lchild,count,k))!=NULL) return p;
else return (Pre_Find_k(t->rchild,count,k));
}
else return NULL;
}