[Structure des données] Supprimez le sous-arbre avec la valeur de nœud x comme nœud racine

Supposons que toutes les valeurs de nœud dans l'arborescence binaire sont des caractères uniques et sont différentes, et sont stockées dans une structure de stockage en chaîne binaire. Concevez un algorithme pour utiliser DestroyBTee pour supprimer et libérer le sous-arbre avec la valeur de nœud x comme nœud racine dans l'arbre binaire b. Parmi eux, DestroyBTree(b) est utilisé pour supprimer et libérer l'arbre binaire avec b comme nœud racine. Il s'agit d'un algorithme de fonctionnement de base des arbres binaires et peut être appelé directement ; et testé avec des données pertinentes.

Exemple d’entrée
A(B(D,E(G,H)),C(,F(I))) B
Exemple de sortie
A(,C(,F(I)))

répondre

#include <iostream>
using namespace std;
#define MaxSize 100
typedef char ElemType;

typedef struct tnode
{
    
    	ElemType data;					
	struct tnode *lchild,*rchild;
} BTNode;
void CreateBTree(BTNode*& bt, char* str)//由括号表示串创建二叉链
{
    
    
	BTNode* St[MaxSize], * p = NULL;
	int top = -1, k, j = 0;
	char ch;
	bt = NULL;			//建立的二叉树初始时为空
	ch = str[j];
	while (ch != '\0')	//str未扫描完时循环
	{
    
    
		switch (ch)
		{
    
    
		case '(':top++; St[top] = p; k = 1; break;//为左孩子结点
		case ')':top--; break;
		case ',':k = 2; break;	//为右孩子结点
		default:p = new BTNode();
			p->data = ch; p->lchild = p->rchild = NULL;
			if (bt == NULL)	//*p为二叉树的根结点
				bt = p;
			else			//已建立二叉树根结点
			{
    
    
				switch (k)
				{
    
    
				case 1:St[top]->lchild = p; break;
				case 2:St[top]->rchild = p; break;
				}
			}
		}
		j++;
		ch = str[j];
	}
}
void DestroyBTree(BTNode*& bt)		//销毁二叉链
{
    
    
	if (bt != NULL)
	{
    
    
		DestroyBTree(bt->lchild);
		DestroyBTree(bt->rchild);
		delete bt;
	}
}
// 在此处补充你的代码
void DispBTree(BTNode* bt)
{
    
    
	if (bt != NULL)
	{
    
    
		cout << bt->data;
		if (bt->lchild != NULL || bt->rchild != NULL)
		{
    
    
			cout << "(";
			DispBTree(bt->lchild);
			if (bt->rchild != NULL)
			{
    
    
				cout << ",";
			}
			DispBTree(bt->rchild);
			cout << ")";
		}
		else
		{
    
    
			//null
		}
	}
}
void DestroygreatTree(BTNode *&bt,char x)
{
    
    
	if (bt == NULL)
	{
    
    
		return;
	}
	if (bt->data == x)
	{
    
    
		DestroyBTree(bt);
		bt=NULL;
	}
	if (bt != NULL)
	{
    
    
		DestroygreatTree(bt->lchild, x);
		DestroygreatTree(bt->rchild, x);
	}
}
int main()
{
    
    
	char tree[MaxSize];
	char ch;
	cin >> tree;
	cin >> ch;
	BTNode* bt;
	CreateBTree(bt, tree);
	DestroygreatTree(bt, ch);
	DispBTree(bt);
	DestroyBTree(bt);
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_52049271/article/details/127269285