二叉树——对称二叉树

二叉树——对称二叉树_第1张图片
题目

对称二叉树


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

二叉树——对称二叉树_第2张图片
对称二叉树中相等的部分

下面是分别用递归和迭代的方法来解题,算法思路是一样的:
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 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;
    }
};

你可能感兴趣的:(二叉树——对称二叉树)