101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)
对称二叉树
递归
- 明确:不是简单的 访问+处理 组合,子树对称和父树对称无关 (类似各种遍历)
- 对称不是左右孩子对称,对称判断是考虑左右子树是否为翻转二叉树,递归体以子树为参数
- 排除法
- 感受整个递归过程的层次感
class Solution {
public:
bool compare(TreeNode* left, TreeNode* right) {
// 注意不是左右子树,是左边的树和对称位置右边的树。
// 如果左右树为空,则当前树对称
if (!left && !right) return true;
// 如果左右树不都为空, 则存在条件使得该树不对称
else if (!left && right || left && !right ||
left->val != right->val) return false;
// 当前左右树无法进一步排除, 进入下一层判断
else return compare(left->left, right->right)
&& compare(left->right, right->left);
}
bool isSymmetric(TreeNode* root) {
if (!root) return true;
return compare(root->left, root->right);
}
};
非递归
- 递归和非递归是一致的思路
- 将递归过程描述出来就是非递归
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
queue<TreeNode*> que;
// 操作的对象是左右树
que.push(root->left);
que.push(root->right);
// 主干代码
while (!que.empty()) {
// 出队当前处理结点
TreeNode* left = que.front();
que.pop();
TreeNode* right = que.front();
que.pop();
// 如果左右树为空,则当前树对称
if (!left && !right) continue;
// 如果左右树不都为空, 则存在条件使得该树不对称
else if (!left && right || left && !right || left->val != right->val) return false;
// 当前左右树无法进一步排除, 进入下一层判断
que.push(left->left);
que.push(right->right);
que.push(left->right);
que.push(right->left);
}
return true;
}
};