首页 > 代码库 > LeetCode: Symmetric Tree [101]

LeetCode: Symmetric Tree [101]

【题目】

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   /   2   2
 / \ / 3  4 4  3

But the following is not:

    1
   /   2   2
   \      3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.



【题意】

    给定一棵二叉树,判断这个二叉树是否自身左右对称


【思路】


    只要判断根节点的左右子树是否对称即可。用递归实现


【代码】

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isMirror(TreeNode* root1, TreeNode* root2){
        if(root1==NULL && root2==NULL)return true;
        if(root1==NULL || root2==NULL)return false;
        //判断根节点
        if(root1->val != root2->val)return false;
        //判断root1的左子树和root2的右子树是否镜面对称
        if(!isMirror(root1->left, root2->right))return false;
        //判断root1的右子树和root2的左子树是否镜面对称
        if(!isMirror(root1->right, root2->left))return false;
        
        return true;
    }

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

【思路2】


    非递归实现(先序遍历实现)

【代码】

/**
 * Definition for binary tree
 * 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==NULL)return true;
        TreeNode*leftPointer = root->left;  //遍历左子树的指针
        TreeNode*rightPointer = root->right;    //遍历右子树的指针
        stack<TreeNode*> st_left;       //遍历左子树的辅助栈
        stack<TreeNode*> st_right;      //遍历右子树的辅助栈
        
        //左子树使用先序遍历,右子树使用对称的方式完成先序遍历
        while(leftPointer && rightPointer){
            if(leftPointer->val != rightPointer->val)return false;
            st_left.push(leftPointer);
            st_right.push(rightPointer);
            leftPointer=leftPointer->left;
            rightPointer=rightPointer->right;
        }
        if(!(leftPointer==NULL && rightPointer==NULL))return false;  //如果对称,则leftPointer和rightPointer应该都是NULL
        
        while(!st_left.empty()&&!st_right.empty()){
            TreeNode* topLeft=st_left.top();    st_left.pop();
            TreeNode* topRight=st_right.top();  st_right.pop();
            leftPointer = topLeft->right;
            rightPointer = topRight->left;
            
            while(leftPointer && rightPointer){
                if(leftPointer->val != rightPointer->val)return false;
                st_left.push(leftPointer);
                st_right.push(rightPointer);
                leftPointer=leftPointer->left;
                rightPointer=rightPointer->right;
            }
            if(!(leftPointer==NULL && rightPointer==NULL))return false;  //如果对称,则leftPointer和rightPointer应该都是NULL
        }
        
        return st_left.empty()&&st_right.empty();
    }
};