0
点赞
收藏
分享

微信扫一扫

单链表的实现(数据结构)

文章目录

须知

接上篇:【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)-CSDN博客

 2.6 二叉树查找位置x的节点
  • 分为左右子树查找,依次递推即可
  • 结束条件为空:说明在这一路径上没有找到
  • 进入第二个if,说明找到了直接返回结点指针
2.6.1 示例代码:
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}

	BTNode* leftFind = BinaryTreeFind(root->left, x);
	if (leftFind)
	{
		return leftFind;
	}
	BTNode* rightFind = BinaryTreeFind(root->right, x);
	if (rightFind)
	{
		return rightFind;
	}
	return NULL;
}
2.7 二叉树的销毁 
2.7.1示例代码:
void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	BinaryTreeDestory(&((*root)->left));
	BinaryTreeDestory(&((*root)->right));

	free(*root);
	*root = NULL;
}

图解:

2.8 二叉树的层序遍历

 层序遍历:对于树型结构,层序遍历就是按层从上到下,每层按一定顺序对树的节点进行遍历。我们通过如图所示的二叉树进行说明:对于左边的二叉树,按层划分后可得到右边的分层结构。

简单来说就是从上到下从左往右打印节点中的数据。

实现层序遍历需要借助数据结构队列(先进先出)

先将根节点入队列, 出队列前打印根节点的数据,同时将根节点的左右孩子入队列,重复该过程,直至队列为空。

2.8.1 示例代码:
//层序遍历
//借助数据结构---队列
void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		//取队头,打印
		BTNode* front = QueueFront(&q);
		printf("%d ", front->data);
		QueuePop(&q);
		//队头节点的左右孩子入队列
		if (front->left)
			QueuePush(&q, front->left);
		if (front->right)
			QueuePush(&q, front->right);
	}
	//队列为空
	QueueDestroy(&q);
}
2.9 完全二叉树的判断

 取队头,左右节点全入队列,当取出对头为空,跳出循环。

进入第二个循环判断剩下的队列是否有非空节点

有则为非完全二叉树,反之亦然。

2.9.1 示例代码:
//判断二叉树是否为完全二叉树
//---队列
bool BinaryTreeComplete(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front == NULL)
		{
			break;
		}
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}
	//队列不一定为空
	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}
	QueueDestroy(&q);
	return true;
}
3. 二叉树性质选择题

二叉树性质

证明:

 

假设⼀个⼆叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点,则这个⼆叉树的边数是

2a+b

另⼀⽅⾯,由于共有 a+b+c 个节点,所以边数等于 a+b+c-1

结合上⾯两个公式:

2a+b = a+b+c-1 ,即a=c-1。

3.1 题目1

1. 某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为( )

A 不存在这样的⼆叉树

B 200

C 198

D 199

选B

根据上述二叉树性质

n0=n2+1即n0=199+1=200

3.2 题目2

2. 在具有 2n 个结点的完全⼆叉树中,叶⼦结点个数为( )

A n

B n+1

C n-1

D n/2

完全二叉树只含有0/1个度为1的节点个数。

选A

3.3 题目3

3. ⼀棵完全⼆叉树的结点数位为 531 个,那么这棵树的⾼度为( )

A 11

B 10

C 8

D 12

选B

 3.4 题目4

4. ⼀个具有 767 个结点的完全⼆叉树,其叶⼦结点个数为()

A 383

B 384

C 385

D 386

 

选B 

4 二叉树遍历选择题
4.1 题目1

1. 某完全⼆叉树按层次输出(同⼀层从左到右)的序列为 ABCDEFGH 。该完全⼆叉树的前序序列为(

A ABDHECFG

B ABCDEFGH

C HDBEAFCG

D HDEBFGCA

选A 

4.2 题目2

根据先序遍历(根左右):

选A 

4.3 题目3

根据先序遍历规则:abcde

选D

4.4 题目4

根据层序遍历规则:FEDCBA

选A 

相信通过这篇文章你对二叉数性质与遍历的有了进一步的了解。如果此篇文章对你学习数据结构(二叉树)有帮助,期待你的三连,你的支持就是我创作的动力!!!

下一篇文章再会!!!

举报

相关推荐

0 条评论