剑指offer 27- 对称的二叉树

时间:2021-6-5 作者:qvyue

请实现一个函数,用来判断一棵二叉树是不是对称的。

如果一棵二叉树和它的镜像一样,那么它是对称的。
样例

如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树:
    1
   / 
  2   2
 /  / 
3  4 4  3

如下图所示二叉树[1,2,2,null,4,4,3,null,null,null,null,null,null]不是对称二叉树:
    1
   / 
  2   2
    / 
   4 4  3

分析:

  • 递归法:
    递归判断两个子树是否互为镜像。

两个子树互为镜像当且仅当:

  • 两个子树的根节点值相等;
  • 第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像;

时间复杂度
从上到下每个节点仅被遍历一遍,所以时间复杂度是 O(n)

  • 用栈模拟递归

时间复杂度
从上到下每个节点仅被遍历一遍,所以时间复杂度是 O(n)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        //用栈模拟递归
        if(!root) return true;
        stack s;
        s.push(root->left);
        s.push(root->right);
        
        while(s.size()) {
            
            TreeNode* right = s.top();
            s.pop();
            TreeNode* left = s.top();
            s.pop();
            if(!left && !right) continue; //此处应该是continue
            if(!left || !right) return false;
            
            if(left->val != right->val) return false;
            s.push(left->left);
            s.push(right->right);
            s.push(left->right);
            s.push(right->left);
            
        }
        return true;
        
        // return !root || 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);
    // }
};
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。