【数据结构与算法】详解 “清华大学(考研)OJ题(2)

本文介绍了如何使用前序遍历算法处理二叉树问题,包括计算节点值的前序遍历,判断两个二叉树是否同构,以及检测一个二叉树是否高度平衡。同时提到了递归技巧在解决这些问题中的关键作用。
摘要由CSDN通过智能技术生成

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

  • 示例 1:

在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,2,3]

  • 示例 2:
输入:root = []
输出:[]

  • 示例 3:
输入:root = [1]
输出:[1]

💡解题关键:

  • 我们需要知道前序遍历的遍历方式
  • 本题就可以运用我们的秒杀技巧

特别注意:

  • 本题中我们需要将前序遍历得到的结点存入数组中,我们便需要提前得知此数组需要开辟多大的空间【即需要知道树的结点个数

👉秒杀分析:

  • 计算树的结点个数时,整棵树(分为根节点左子树右子树)来看就是:

左子树总的结点个数 + 右子树总的结点个数 + 1(根节点)

  • 所以逻辑关系为:+

👆综上:

  • 秒杀口诀为:+后序遍历
  • 本质:利用递归的性质,先计算左子树总的结点个数,再计算右子树总的结点个数,最终返回的是左子树右子树总的结点个数的和 + 1(根节点自身个数)

动图示例:

在这里插入图片描述

👉代码实现:

int treeSize(struct TreeNode\* root)
{
	return root == NULL ? 0 : treeSize(root->left) + treeSize(root->right) + 1;
}

void preorder(struct TreeNode\* root, int\*arr, int\* i)
{
	//前序遍历
	if (root == NULL)
	{
		return;
	}

	arr[(\*i)++] = root->val;

	preorder(root->left, arr, i);
	preorder(root->right, arr, i);
}

int\* preorderTraversal(struct TreeNode\* root, int\* returnSize) 
{
	\*returnSize = treeSize(root);

	int\* arr = (int\*)malloc(sizeof(int)\*(\*returnSize));

	int i = 0;
	preorder(root, arr, &i);

	return arr;
}

➡️补充:

  • 我们需要带着自己开辟的数组数组下标进行前序遍历,因为需要将遍历得到的结点存入数组中
  • 所以每一次下标的改变都需要让不同的递归栈帧知道,所以下标需要传的是地址(否则如果传的是下标的临时拷贝,那数组内的结点之间就会造成覆盖)

🏷️ 另一棵树的子树【难度:简单】

🔍题目传送门:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值