Detaillierte Erstellung, Zerstörung und Durchquerung von Binärbäumen, vollständige Implementierung des Binärbaum-Beurteilungscodes

Inhaltsverzeichnis

1. Entwerfen Sie die Datenstruktur und Schnittstellen, die implementiert werden müssen

binärer_Baum.h

2. Implementierung spezifischer Funktionen

1. Erstellen Sie anhand einer Zeichen-Array-Sequenz einen Binärbaum, wobei # zur Darstellung eines Nullzeigers verwendet wird

2. Seine Zerstörung

3. Durchquerung von Binärbäumen vor und nach der Bestellung und Ebene

4. Bestimmen Sie, ob ein Baum ein vollständiger Binärbaum ist


1. Entwerfen Sie die Datenstruktur und Schnittstellen, die implementiert werden müssen

binärer_Baum.h

typedef struct BinaryTreeNode
{
	BTDataType _data;
	struct BinaryTreeNode* _left;
	struct BinaryTreeNode* _right;
}BTNode;

void BinaryTreeDestory(BTNode** root);

BTNode* BinaryTreeCreate(BTDataType* cur, int n, int* _i);

void BinaryTreePrevOrder(BTNode* root);

void BinaryTreeInOrder(BTNode* root);

void BinaryTreePostOrder(BTNode* root);

void BinaryTreeLevelOrder(BTNode* root);

int BinaryTreeComplete(BTNode* root);

2. Implementierung spezifischer Funktionen

1. Erstellen Sie anhand einer Zeichen-Array-Sequenz einen Binärbaum, wobei # zur Darstellung eines Nullzeigers verwendet wird

BTNode* BinaryTreeCreate(BTDataType* cur, int n, int* _i)
{
	if (*_i >= n || cur[*_i] == '#')
	{
		(*_i)++;
		return NULL;
	}

	BTNode* _new = (BTNode*)malloc(sizeof(BTNode));
	_new->_data = cur[*_i];
	(*_i)++;

	_new->_left = BinaryTreeCreate(cur, n, _i);
	_new->_right = BinaryTreeCreate(cur, n, _i);

	return _new;
}

2. Seine Zerstörung

void BinaryTreeDestory(BTNode** root)
{
	if (*root)
	{
		BinaryTreeDestory(&(*root)->_left);//因为销毁的时候传入的是二级指针,所以直接对*root取地址给这个二级指针;
		BinaryTreeDestory(&(*root)->_right);
		free(*root);
		*root = NULL;//这里传入二级指针的作用就是为了对根节点进行置空,不然没有必要。
	}
}

3. Durchquerung von Binärbäumen vor und nach der Bestellung und Ebene

void BinaryTreePrevOrder(BTNode* root)
{
	if (root)
	{
		putchar(root->_data);
		BinaryTreePrevOrder(root->_left);
		BinaryTreePrevOrder(root->_right);
	}
}

void BinaryTreeInOrder(BTNode* root)
{
	if (root)
	{
		BinaryTreeInOrder(root->_left);
		putchar(root->_data);
		BinaryTreeInOrder(root->_right);
	}
}

void BinaryTreePostOrder(BTNode* root)
{
	if (root)
	{
		BinaryTreePostOrder(root->_left);
		BinaryTreePostOrder(root->_right);
		putchar(root->_data);
	}
}



void BinaryTreeLevelOrder(BTNode* root)
{
	Queue qu;
	BTNode* cur;

	QueueInit(&qu);

	QueuePush(&qu, root);

	while (!QueueIsEmpty(&qu))
	{
		cur = QueueTop(&qu);

		putchar(cur->_data);

		if (cur->_left)
		{
			QueuePush(&qu, cur->_left);
		}

		if (cur->_right)
		{
			QueuePush(&qu, cur->_right);
		}

		QueuePop(&qu);
	}

	QueueDestory(&qu);
}

4. Bestimmen Sie, ob ein Baum ein vollständiger Binärbaum ist

Um zu beurteilen, ob ein Baum ein „vollständiger Binärbaum“ ist, muss er hierarchisch durchlaufen werden. Wenn ein leerer Knoten gefunden wird, müssen alle Knoten dahinter leere Knoten sein, andernfalls handelt es sich nicht um einen vollständigen Binärbaum.

int BinaryTreeComplete(BTNode* root)
{
	Queue qu;
	BTNode* cur;
	int tag = 0;

	QueueInit(&qu);

	QueuePush(&qu, root);

	while (!QueueIsEmpty(&qu))对每一层每一个节点的左右节点进行检查,完全没有问题则检查下一个节点
	{
		cur = QueueTop(&qu);

		putchar(cur->_data);

		if (cur->_right && !cur->_left)
		{
			return 0;
		}

		if (tag && (cur->_right || cur->_left))
		{
			return 0;
		}

		if (cur->_left)
		{
			QueuePush(&qu, cur->_left);
		}

		if (cur->_right)
		{
			QueuePush(&qu, cur->_right);
		}
		else//当右边子树为空的时候,只要在后续层序遍历再能遍历到任何一个节点,那么它必然不是完全二叉树
		{
			tag = 1;
		}

		QueuePop(&qu);
	}

	QueueDestory(&qu);
	return 1;
}

Guess you like

Origin blog.csdn.net/m0_74234485/article/details/131583533