首页 > 其他分享 >【数据结构】二叉树的遍历

【数据结构】二叉树的遍历

时间:2024-09-18 18:25:03浏览次数:11  
标签:遍历 return BTNode 二叉树 数据结构 root 节点

堆的应用

堆排列

堆排序即利用堆的思想来进行排序,总共分为两个步骤:

  1. 建堆
    升序:建大堆
    降序:建小堆

  2. 利用堆删除思想来进行排序
    建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。
    在这里插入图片描述

void HeapSort(int* a, int n)
{
	// a数组直接建堆 O(N)
	for (int i = (n-1-1)/2; i >= 0; --i)
	{
		AdjustDown(a, n, i);
	}

	// O(N*logN)
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}

TOP-K问题

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。
最佳的方式就是用堆来解决,基本思路如下:

  1. 用数据集合中前K个元素来建堆
    前k个最大的元素,则建小堆
    前k个最小的元素,则建大堆

  2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素

  3. 将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。

二叉树链式结构的实现

二叉树的遍历

前序、中序以及后序遍历

学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。

访问节点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
在这里插入图片描述
按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

  1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。

NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

//前序遍历
void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	printf("%d ", root->val);
	PreOrder(root->left);
	PreOrder(root->right);
}
//中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}
//后序遍历
void  PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	 PostOrder(root->left);
	 PostOrder(root->right);
	 printf("%d ", root->val);
}

在这里插入图片描述
在这里插入图片描述
前序遍历结果:1 2 3 4 5 6
中序遍历结果:3 2 1 5 4 6
后序遍历结果:3 2 5 6 4 1

层序遍历

层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
在这里插入图片描述

// 层序遍历(需要用到队列)
void BinaryTreeLevelOrder(BTNode* root) {
	Que q;//定义一个队列
	QueueInit(&q);//初始化队列
	
	if (root)
		QueuePush(&q, root);//如果根节点不为空则入队列
		
	while (!QueueEmpty(&q)) 
	{
		BTNode* front = QueueFront(&q);//指针指向队头
		printf("%c ", front->data);//输出队头字符
		
		if(front->left!=NULL)//如果左子树存在则将其入队列
			QueuePush(&q, front->left);
			
		if(front->right!=NULL)//如果右子树存在则将其入队列
			QueuePush(&q, front->right);
		QueuePop(&q);//将头结点删除,并将下一个结点变为队头
	}
	
	printf("\n");
	QueueDestroy(&q);//销毁队列
}

在这里插入图片描述

节点个数以及高度等其他接口函数

//求二叉树总节点个数
int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : 
		TreeSize(root->left) + TreeSize(root->right) + 1;
}

// 求二叉树第k层的节点个数
int TreeKLevel(BTNode* root, int k)
{
	assert(k > 0);

	if (NULL == root)
		return 0;

	if (k == 1)
		return 1;

	// 不等于空,且k > 1说明第k层的节点在子树里面,转换成子问题求解
	return TreeKLevel(root->left, k - 1)
		+ TreeKLevel(root->right, k - 1);
}
// 查找x所在的节点
BTNode* TreeFind(BTNode* root, int x)
{
	if (root == NULL)
		return NULL;

	if (root->val == x)
		return root;

	BTNode* ret1 = TreeFind(root->left, x);
	if (ret1)
		return ret1;

	BTNode* ret2 = TreeFind(root->right, x);
	if (ret2)
		return ret2;

	return NULL;
}

标签:遍历,return,BTNode,二叉树,数据结构,root,节点
From: https://blog.csdn.net/Sakura_ding/article/details/142338880

相关文章

  • Python 中常见的数据结构(一)
    Python中常见的数据结构(一)Python是一种功能强大且灵活的编程语言,它提供了多种内置的数据结构,可以帮助我们更好地组织和处理数据。在这个文章中,我们将探讨Python中最常见的一些数据结构,并结合实例来演示它们的使用。1.字典(Dictionary)字典是一种键值对的数据结构,它允许我们根据......
  • Python 中常见的数据结构(二)
    Python中常见的数据结构(二)6.栈(Stack)栈是一种后进先出数据结构,Python中,可以使用list类型创建一个栈,例如:stack=[]stack.append('apple')stack.append('banana')print(stack.pop())#Output:banana在上面的示例中,我们创建了一个名为stack的栈,然后使用append方法添加......
  • 【数据结构和算法实践-树-LeetCode112-路径总和】
    数据结构和算法实践-树-LeetCode112-路径总和题目MyThought代码示例JAVA-8题目给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则......
  • 各种数据结构以及七七八八的东西
    堆堆(一般指二叉堆),实质就是一颗完全二叉树,用来维护单调性堆可以实现插入新值,得到最值(直接取堆顶值),删除最值。插入新值,从堆尾插入,不断比较上浮;删除最值,就是将堆顶替换掉,可以用堆尾替换,并不断比较下沉,用树的深度的时间花销维护堆的单调性感受一下维护堆的过程,可以用数组实现(一......
  • 数据结构(二叉树)练习题————考前必备合集
    今天在力扣和牛客网上找了一下题,下面附上题目链接,大家先做题再看答案1.检查两颗树是否相同。100.相同的树-力扣(LeetCode)2.另一颗树的子树。572.另一棵树的子树-力扣(LeetCode)3.翻转二叉树。226.翻转二叉树-力扣(LeetCode)4.判断一颗二叉树是否是平衡二叉树。110.......
  • 算法与数据结构——哈希优化策略与算法选择
    哈希优化策略在算法题中,我们通常通过线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。Question给定一个整数数组nums和一个目标元素target,请在数组中搜索“和”为target的两个元素,并返回他们的数组索引。返回任意一个即可。线性查找:以时间换......
  • 【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣965, 2331, 100, 1379
    1.力扣965:单值二叉树1.1题目:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例1:输入:[1,1,1,1,1,null,1]输出:true示例2:输入:[2,2,2,5,2]输出:false提示:给定树的节点数范围是 [1,......
  • 【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623
    1.力扣1022:从根到叶的二进制之和1.1题目:给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0->1->1->0->1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出......
  • 超级详细的AVLTree -- 高度平衡二叉树 -- 底层代码实现
    超级详细的AVLTree–高度平衡二叉树–底层代码实现目录AVLTree简介1.节点结构体定义2.AVLTree类定义及插入函数3.左旋转函数(RotateL)4.右旋转函数(RotateR)5.左右双旋转函数(RotateLR)6.右左双旋转函数(RotateRL)7.中序遍历函数(Inorder)8.计算树的高度(Height)9.判断......
  • 【二叉树进阶】二叉搜索树
    目录1.二叉搜索树概念2.二叉搜索树的实现2.1创建二叉搜索树节点2.2创建实现二叉搜索树2.3二叉搜索树的查找2.4 二叉搜索树的插入2.5二叉搜索树的删除2.6中序遍历2.7 完整代码加测试3.二叉搜索树的应用3.1K模型:3.2KV模型:4.二叉搜索树的性能分析1.......