- 树为空树,亦为对称二叉树
- 树非空时,仅需判断其左右子树是否对称
- 判断左右子树对称
(1) 左右子树是否为空,有一个为空 便不对称, 都为空或都不为空 可能对称
(2) 左右子树根节点值是否相同
(3) 判断 左子树 的 左子树 与 右子树 的右子树 是否相同
(4) 判断 左子树 的 右子树 与 右子树 的左子树 是否相同
递归方式
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if( !root ) return true;
return dfs(root->left,root->right);
}
bool dfs(TreeNode * l, TreeNode * r)
{
if(!l || !r)
return !l && !r;
if(l->val != r->val)
return false;
return dfs(l->left,r->right) && dfs(l->right,r->left);
}
};
迭代方式
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
stack<TreeNode*> l , r;
auto p = root->left , q = root->right;
while(p || q || l.size() || r.size())
{
while(p && q){
l.push(p); p = p->left;
r.push(q); q = q->right;
}
if( p || q)
return false;
p = l.top() , l.pop();
q = r.top() , r.pop();
if(p->val != q->val) return false;
p = p->right;
q = q->left;
}
return true;
}
};
- 采用类似中序遍历方式迭代
- 对根节点的左子树进行 左 根 右 的方式遍历
- 对根节点的右子树进行 右 根 左 的方式遍历
- 2和3中的遍历同时进行
- 一旦发现 二者在 第一次遍历至 树的最深 处时 ,不一致 ,即返回false
- 一旦发现 二者在 栈顶 数值 不一致 ,即返回false
中序遍历迭代方式一
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
while(root || s.size())
{
if( root )
{
s.push(root);
root = root->left;
}else{
root = s.top() , s.pop();
res.push_back(root->val);
root = root->right;
}
}
return res;
}
};
中序遍历迭代方式二
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
while(root || !s.empty())
{
while(root){
s.push(root);
root = root->left;
}
root = s.top() , s.pop();
res.push_back(root->val);
root = root->right;
}
return res;
}
};