刚刚荔枝在刷Leecoded的一道DFS题目,看到题目的时候就知道用递归了,但呆呆敲了小半个钟好像还是有一点问题,记录一下自己认知的更新哈哈哈。
目录
前言
一、题目——Leecode100.相同的树
二、举一反三——Leecode101.对称二叉树
总结
题目描述:
给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入示例1:
[1,2,3]
[1,2,3]
输出示例1:
true
输入示例2:
[1,2]
[1,null,2]
输出示例2:
false
最初的demo:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//我的思路:
// 可以说没有吗哈哈哈——执行搜索,将所有的结点比较一下,中序遍历或者前序遍历二叉树比较好
bool flag = false;
bool isSameTree(TreeNode* p, TreeNode* q) {
// 首先还是判断非法条件
if(p==nullptr && q!=nullptr) return flag;
if(q==nullptr && p!=nullptr) return flag;
if(q==nullptr && q==nullptr) return true;
// 判断相等的条件
if(p->val==q->val){
if(p->left==nullptr && p->right==nullptr){
if(q->left==nullptr && p->right==nullptr){
flag = true;
}
}else{
isSameTree(p->left,q->left);
isSameTree(p->right,q->right);
}
}
return flag;
}
};
这道题目其实比较简单,就是同时对两个二叉树结构进行遍历,比较对应位置的元素以及该二叉树的内部结构的异同。因为涉及到二叉树,自然而然就想到DFS,而DFS底层就是递归。荔枝最初的想法确实是递归,但其实看着这段demo可以发现,虽然我使用了全局变量flag作为标记,但是没考虑到子递归并没有将修改后的状态传递给上层递归,因此可能会出错。看到这里,其实我才有点悟了,原来你是这样的递归哈哈哈。我们总说递归无非就是递推加回溯呐,但说是这么说,亲自体会又是一种感觉哈哈哈。
通过的demo:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
// 首先还是判断非法条件
if(p==nullptr && q==nullptr){
return true;
}else if(p==nullptr || q==nullptr){
return false;
}
// 边界条件
if(p->val!=q->val){
return false;
}
// 递归实现
bool leftTree = isSameTree(p->left,q->left);
bool rightTree = isSameTree(p->right,q->right);
return leftTree && rightTree;
}
};
题目描述:
给你一个二叉树的根节点
root
, 检查它是否轴对称。
- 树中节点数目在范围
[1, 1000]
内-100 <= Node.val <= 100
输入示例1:
[1,2,2,null,3,null,3]
输出示例1:
false
输入示例2:
[1,2,2,3,4,4,3]
输出示例2:
true
解题思路:
在一开始看到这道题目的时候其实荔枝不知道怎么去遍历整个二叉树比较好,可能是刚才写了上面拿到检查两个子树是否相同让我灵光一闪——或许可以改成上面那道题目:其实就是把输入的二叉树分成一个根节点和两个子树,比较两个子树的异同即可检查该二叉树是否对称,需要注意的是子树递归的传参跟上面那道题目略有区别,然后荔枝就按照自己的想法来了,整个解题过程非常顺畅,点击提交直接通过哈哈哈哈。
解题demo:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isSame(TreeNode* rootleft,TreeNode* rootright){
if(rootleft==nullptr && rootright==nullptr){
return true;
}else if(rootleft==nullptr || rootright==nullptr){
return false;
}
if(rootright->val!=rootleft->val){
return false;
}
bool isleft = isSame(rootleft->left,rootright->right);
bool isright = isSame(rootleft->right,rootright->left);
return isleft && isright;
}
bool isSymmetric(TreeNode* root) {
bool result = false;
if(root->left!=nullptr && root->right!=nullptr){
result = isSame(root->left,root->right);
}else if(root->left==nullptr && root->right==nullptr){
result = true;
}
return result;
}
};
不知道有没有小伙伴跟我一个想法的哈哈哈~~~
所以,我是真的理解递归了吗?我觉得或许没有,那什么时候能真正学会呢?可能在明天、可能就在下一道题里。。。
今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~