LeetCode101.对称二叉树 C++
实现方法:
1.递归
2.迭代
详细思路在代码注释中
class Solution {
public:
/*
// 递归写法思路:
// 1.两个根节点的值要相等
// 2.左边的左子树和右边的右子树对称
// 3.左边的右子树和右边的左子树对称
bool isSymmetric(TreeNode* root) {
// 特殊情况 根root为空树,返回true
if (!root) return true;
// 判断左右子树是否为对称
return dfs(root->left, root->right);
}
bool dfs(TreeNode* p, TreeNode* q){
// 一个为空,一个不为空,就不是对称
// 两个都为空 就是对称
if (!p || !q) return !p && !q;
return p->val == q->val && dfs(p->left, q->right) && dfs(p->right, q->left);
}
*/
// 迭代写法
// 左边:左中右遍历
// 右边:右中左遍历
bool isSymmetric(TreeNode* root) {
if (!root) return true;
// 定义两个栈 分别用来左右子树的遍历
stack<TreeNode*> left, right;
auto l = root->left, r = root->right;
while (l || r || left.size() || right.size()){
while (l && r){// 将最左边的最右边的链压入栈中
left.push(l), l = l->left;
right.push(r), r = r->right;
}
// l和r一个为空一个不为空
if (l || r) return false;
l = left.top(), left.pop();
r = right.top(), right.pop();
if (l->val != r->val) return false;
l = l->right;
r = r->left;
}
return true;
}
};