目录
a. 二叉树的概念以及实现参照博客:
一、三道题的oj链接
二、每题讲解
1.单值二叉树
a. 题目:
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回
true
;否则返回false
。示例一:
输入:[1,1,1,1,1,null,1] 输出:true示例二:
输入:[2,2,2,5,2]
输出: false
提示:
- 给定树的节点数范围是
[1, 100]
。- 每个节点的值都是整数,范围为
[0, 99]
b. 题目所给代码
bool isUnivalTree(struct TreeNode* root) {
}
c. 思路
根据题目要求,如果这棵树中每个节点的值都相同,那就返回true,如果有值不相同就返回false,如果该节点为空也返回true。
若节点不为空则检查他的左右子树的值是否与他相等。
根据所举例子可以做出如图:
d. 代码:
bool isUnivalTree(struct TreeNode* root) {
if(root == NULL)
return true;
if(root->left && root->left->val != root->val)
return false;
if(root->right && root->right->val != root->val)
return false;
return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
2. 相同的树
a. 题目
给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例一:
输入:p = [1,2,3], q = [1,2,3] 输出:true示例二:
输入:p = [1,2],q = [1,null,2]
输出:false
提示:
- 两棵树上的节点数目都在范围
[0, 100]
内-104 <= Node.val <= 104
b. 题目所给代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
}
c. 思路
根据题目要求:
比较两棵树,是否是完全相同的树,不仅仅是结构,他们的每个结点的值也相等那该如何比较?
1. 互相比较根节点
2. 互相比较左子树
3. 互相比较右子树
如图:
d. 代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//都为空
if(p == NULL && q == NULL)
return true;
//其中一个为空
if(p == NULL || q == NULL)
return false;
//都不为空切不相等
if(p->val != q->val)
return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
3. 二叉树的前序遍历
a. 题目
给你二叉树的根节点
root
,返回它节点值的 前序 遍历。示例一:
输入:root = [1,null,2,3] 输出:[1,2,3]示例 2:
输入:root = [] 输出:[]示例 3:
输入:root = [1] 输出:[1]示例 4:
输入:root = [1,2] 输出:[1,2] 示例 5:输入:root = [1,null,2] 输出:[1,2]提示:
- 树中节点数目在范围
[0, 100]
内-100 <= Node.val <= 100
b. 题目所给代码
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
}
所给参数 int* returnSize:在这里返回数组后,不知数组的大小,凡是返回结果是一串值,存在一个数组,都会配一个 int* returnSize来返回这个数组的大小
c. 思路
根据题目要求,我们知道最终的代码需要放在数组里,我们需要创建一个数组,用于存储该树的值。遍历我们的二叉树,来得到他的左右子树的值
可以将代码画展开递归图;
d. 代码
int TreeSize(struct TreeNode* root)
{
return root == NULL? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
void preorder(struct TreeNode* root , int* a,int* pi)
{
if(root == NULL)
return ;
a[ (*pi)++ ] = root->val;//想一想这里为什么要这么写
preorder(root->left,a,pi);
preorder(root->right,a,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
int n = TreeSize(root);
int*a = (int*)malloc(sizeof(int)*n);
*returnSize = n;
int i = 0;
preorder(root,a,&i);
return a;
}
a[ (*pi)++ ] = root->val;能够使每次的值都不会被销毁。
二叉树的oj题还会持续更新,关注主播,让我们一起学习,一起进步。
结语:
随着这篇关于题目解析的博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。解题的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。
在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。 你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容,让我们在知识的道路上共同前行。