普通二叉树的判断是否为完全二叉树,二叉树的销毁

普通二叉树的判断是否为完全二叉树

  1. 借助结论,完全二叉树按层序走,非空节点一定是连续的
  2. 就是利用队列的这个数据结构,当有一个树的节点地址出队列的时候,就把该节点的两个子节点地址给他带到队列里面,包括NULL。然后到第一次出NULL时,判断一下这个对你里面现在是不是全为空指针,如果是的话,就说明这个树是一棵完全二叉树,否则就不是
  3. 对于队列的话不能向顺序表与数组一样可以去随机访问里面的任意一个元素,或者说支持下标访问,是不支持的
  4. 队列的具体手搓实现代码就不发出来了
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"

TreeNode* BuyNode(TreeDataType x)
{
	TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		return;
	}

	newnode->val = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

TreeNode* CreateTree()
{
	TreeNode* node1 = BuyNode(3);
	TreeNode* node2 = BuyNode(4);
	TreeNode* node3 = BuyNode(8);
	TreeNode* node4 = BuyNode(7);
	TreeNode* node5 = BuyNode(1);
	TreeNode* node6 = BuyNode(4);
	TreeNode* node7 = BuyNode(2);
	TreeNode* node8 = BuyNode(3);
	TreeNode* node9 = BuyNode(9);
	TreeNode* node10 = BuyNode(6);
	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node2->right = node5;
	node3->left = node6;
	node3->right = node7;
	node4->left = node8;
	node4->right = node9;
	node5->right = node10;
	return node1;
}

void LevelOrder(TreeNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		TreeNode* tmp = QueueFront(&q);
		printf("%d ", tmp->val);
		QueuePop(&q);
		if (tmp->left != NULL)
		{
			QueuePush(&q, tmp->left);
		}
		if (tmp->right != NULL)
		{
			QueuePush(&q, tmp->right);
		}
	}
	QueueDestroy(&q);
}

bool TreeComplete(TreeNode* root)
{
	if (root == NULL)
	{
		return true;
	}
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		TreeNode* tmp = QueueFront(&q);
		if (tmp == NULL)
		{
			break;
		}
		QueuePop(&q);
		QueuePush(&q, tmp->left);
		QueuePush(&q, tmp->right);
	}
	while (!QueueEmpty(&q))
	{
		TreeNode* tmp = QueueFront(&q);
		QueuePop(&q);
		if (tmp != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}
	QueueDestroy(&q);
	return true;
}

int main()
{
	TreeNode* root = CreateTree();
	LevelOrder(root);
	printf("\n");
	if (TreeComplete(root) == true)
	{
		printf("此二叉树就是完全二叉树");
	}
	else
	{
		printf("此二叉树不是完全二叉树");
	}
	return 0;
}

普通二叉树的销毁

  1. 也使用递归来完成
    普通二叉树的判断是否为完全二叉树,二叉树的销毁_第1张图片
void TreeDestroy(TreeNode* root)
{
	if (root == NULL)
	{
		return;
	}
	TreeDestroy(root->left);
	TreeDestroy(root->right);
	free(root);
}

我们发现:判断一颗二叉树是不是完全二叉树,二叉树的层序遍历用队列数据结构来实现,其他的话都是递归分治香啊

你可能感兴趣的:(数据结构,数据结构)