バイナリツリートラバーサルアプリケーション

再帰的アルゴリズムは、バイナリツリーのすべてのリーフノードを削除します

バイナリツリーが空の場合、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;
} 
公開された28元の記事 ウォンの賞賛2 ビュー3259

おすすめ

転載: blog.csdn.net/Maestro_T/article/details/84190546