美文网首页
二叉树——对称二叉树

二叉树——对称二叉树

作者: 水橋美咲 | 来源:发表于2018-07-28 09:39 被阅读0次
题目
对称二叉树

二叉树由于其本身具有递归特性,所以绝大部分二叉树的算法题用递归的方法都很好解。如果不用递归方法,也可以使用堆栈以及队列来对二叉树进行迭代,其实算法思想都是一样的。
这道题有两个解题思路:
第一个思路是层序遍历,因为对称二叉树每一层的遍历结果都是回文串。这样的方法虽然比较直观,但是实现起来不如下面的简单。
第二个思路是,在对称二叉树中,我们把整棵树分为左部分和右部分(根节点的左右子树),其中左部分和右部分是镜像对称的,所以有这样的结论:左子树的左子树和右子树的右子树的节点值是相等的(这里指的是左子树的左子树的根节点,而不是整颗子树),且左子树的右子树和右子树的左子树也有这样的结论。

对称二叉树中相等的部分
下面是分别用递归和迭代的方法来解题,算法思路是一样的:
1.递归
class Solution {
public:
    bool compareTree(TreeNode* left, TreeNode* right) {
        if (left == NULL && right == NULL) return true;
        else if (left == NULL && right != NULL || left != NULL && right == NULL) return false;

        if (left->val == right->val) {
            return compareTree(left->left, right->right) && compareTree(left->right, right->left);
        } else {
            return false;
        }
    }

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

2.迭代

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        stack<TreeNode*> s;
        if(root->left and root->right){
            s.push(root->left);
            s.push(root->right);
        } else if(!root->left and !root->right) {
            return true;
        } else {
            return false;
        }
        while(!s.empty()){
            TreeNode* p = s.top();
            s.pop();
            TreeNode* q = s.top();
            s.pop();
            if(p->val != q->val) return false;
            if(p->left and q->right){
                s.push(p->left);
                s.push(q->right); 
            } else if((p->left and !q->right) or (!p->left and q->right)) {
                return false;
            }
            if(p->right and q->left){
                s.push(p->right);
                s.push(q->left);  
            } else if((p->right and !q->left) or (!p->right and q->left)) {
                return false;                
            }
        }
        return true;
    }
};

相关文章

  • 【LeetCode】101-对称二叉树

    对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的...

  • LeetCode-101-对称二叉树

    LeetCode-101-对称二叉树 101. 对称二叉树[https://leetcode-cn.com/pro...

  • 2019-04-09 BFS广度优先搜索刷题Day1

    Leetcode 101 对称二叉树 题目描述: 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2...

  • JZ-058-对称的二叉树

    对称的二叉树 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样...

  • 剑指offer | 对称二叉树

    对称二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的如果一棵二叉树和它的镜像一样,那么它是对称的 分析:根据...

  • 面试题28. 对称的二叉树

    对称的二叉树 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称...

  • Swift 对称二叉树 - LeetCode

    题目: 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对...

  • LeetCode 101. 对称二叉树 | Python

    101. 对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3]...

  • 第九天的leetcode刷题

    今天的题目是判断是否为对称二叉树:101. 对称二叉树[https://leetcode-cn.com/probl...

  • 101. 对称二叉树

    101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对...

网友评论

      本文标题:二叉树——对称二叉树

      本文链接:https://www.haomeiwen.com/subject/vconmftx.html