101. 对称二叉树,c++迭代递归解法

101. 对称二叉树,c++迭代递归解法

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

这道题可以用迭代和递归两种方法求解

迭代法代码如下,主要思想是,将树的左右分支放入两个队列中。因为题目是判断两个数是否对称,所以在将节点a的孩子放左队列时,先放a的右子结点,再放a的左子结点;在将节点b的孩子放入右队列时,先放b的左子节点,再放b的右子节点。如果该数对称,则按照该放法,左右队列是相等。若左右队列不相等,则该二叉树不对称。

 class Solution {
public:
    bool isSymmetric(TreeNode* ro) {

        if(root==NULL)
            return true;
        queue<TreeNode*> left;
        left.push(root->left);
        queue<TreeNode*> right;
        right.push(root->right);
        while (!right.empty()&&!left.empty())
        {
            TreeNode* cur_left = left.front();
            TreeNode* cur_right=right.front();
            left.pop();
            right.pop();
            if(cur_left==NULL||cur_right==NULL){
                if(cur_left==NULL&&cur_right==NULL)
                    continue;
                return false;
            }
            if(cur_right->val!=cur_left->val)
                return false;
            left.push(cur_left->right);
            left.push(cur_left->right);
            right.push(cur_right->left);
            right.push(cur_right->right);
        }
        return true;
    }
};

递归法:

这种方法是看了解答以后写出来的,代码简洁很多,但思想和迭代法一样,判断left的左子节点和right的右子节点是否相同,left的右子节点和right的左子节点是否相同。

public:
    bool isSymmetric(TreeNode* ro) {
        return isMirror(root,root);
    }
    bool isMirror(TreeNode* left,TreeNode *right){
        if(left==NULL&&right==NULL) return true;
        if(left==NULL||right==NULL) return false;
        return (left->val==right->val)&&
        isMirror(left->right,right->left)&&
        isMirror(left->left,right->right);
    }
};

猜你喜欢

转载自www.cnblogs.com/Natakkx/p/12347967.html