0
点赞
收藏
分享

微信扫一扫

LeetCode对称二叉树

斗米 2022-08-17 阅读 83


题目描述

LeetCode对称二叉树_递归


看到这题就知道要用递归,哎,最讨厌二叉树的题,就是因为不理解递归。有什么办法呢,越是不会越要学会,硬着头皮做吧。emmm,想了10分钟,不会。。算了,直接看评论吧,于是我看到了一长段话,如下:

LeetCode对称二叉树_二叉树_02


根据提示,我开始写代码,附上本人的辣鸡代码

class Solution {
public:
bool judge(TreeNode* l , TreeNode* r){
if(l == NULL && r == NULL) return true;
if(l == NULL && r != NULL) return false;
if(l != NULL && r == NULL) return false;
if(l->val != r->val) return false;
return judge(l->left , r->right) && judge(l->right , r->left);
}

bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return judge(root->left , root->right);
}
};

LeetCode对称二叉树_结点_03


妙啊,我居然写出来了(写出来才发现算法如此简单),哈哈哈,本来还准备直接看人家的代码,多谢写评论的大哥

代码调整一下能更快

class Solution {
public:
bool judge(TreeNode* l , TreeNode* r){
if(!l && !r) return true;//都为空
if(!l || !r) return false;//有一个为空
return l->val == r->val && judge(l->left , r->right) && judge(l->right , r->left);
}

bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return judge(root->left , root->right);
}
};

LeetCode对称二叉树_递归_04

广度优先方法(队列实现)

bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;

queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);

while(!q.empty()){
TreeNode* l = q.front();
q.pop();
TreeNode* r = q.front();
q.pop();
if(!l && !r) continue;//结点都空时,后面再放入孩子结点则报错,直接下一次循环,取队列中的结点
if(!l || !r) return false;//只有一个结点为空时
if(l->val != r->val) return false;

q.push(l->left);
q.push(r->right);
q.push(r->left);
q.push(l->right);
}
return true;
}

LeetCode对称二叉树_二叉树_05

相同二叉树

LeetCode对称二叉树_二叉树_06


LeetCode对称二叉树_递归_07

解法和上述一模一样

bool isSameTree(TreeNode* p, TreeNode* q) {
// 都为空
if(!p && !q) return true;
// 只有一个为空
if(!p || !q) return false;
// 都不空
return p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}


举报

相关推荐

0 条评论