您的位置:首页 > 编程语言 > C语言/C++

LeetCode - 101. Symmetric Tree (C++)

2018-03-16 22:10 537 查看
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For example, this binary tree 
[1,2,2,3,4,4,3]
 is symmetric: 1
/ \
2 2
/ \ / \
3 4 4 3
But the following 
[1,2,2,null,3,null,3]
 is not:
1
/ \
2 2
\ \
3 3
Note:
Bonus points if you could solve it both recursively and iteratively.

递归(recursive)版本:
/**
 * 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 == NULL) {
            return true;
        }
        if (root->left == NULL && root->right == NULL) {
            return true;
        } else if (root->left == NULL || root->right == NULL) {
            return false;
        } else {
            return isSymmetricCompare(root->left, root->right);
        }
    }
    
    bool isSymmetricCompare(TreeNode* left, TreeNode* right) {
        if (left->val != right->val) {
            return false;
        }
        bool b1, b2;
        if (left->left == NULL && right->right == NULL) {
            b1 = true;
        } else if(left->left == NULL || right->right == NULL) {
            return false;
        } else {
            b1 = isSymmetricCompare(left->left, right->right);
        }
        
        if(left->right == NULL && right->left == NULL) {
            b2 = true;
        } else if (left->right == NULL || right->left == NULL) {
            return false;
        } else {
            b2 = isSymmetricCompare(left->right, right->left);
        }
        
        return b1 && b2;
    }

};

非递归(iteratively)版本:将左右子树放入栈中,每次pop出最上面的两棵树,如果这两棵树的根节点不同,那么直接返回false,否则如果这两棵树都有左右子树,那么则把第一棵树的左子树和第二棵树的右子树push到栈里,继续把第一棵树的右子树和第二颗树的左子树push到栈里;重复循环,直到栈内没有元素了。但是图中如果元素的个数为奇数则可以马上返回false,结束程序。(栈可以存NULL)

/**
 * 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 == NULL) {
            return true;
        }
        stack<TreeNode*> stackTree;
        //TreeNode leftNode(0);
        //TreeNode rightNode(0);
        TreeNode* left; //= &leftNode;
        TreeNode* right;// = &rightNode;
        if (root->left == NULL && root->right == NULL) {
            return true;
        } else if (root->left == NULL || root->right == NULL) {
            return false;
        } else {
            stackTree.push(root->left);
            stackTree.push(root->right);
            while (!stackTree.empty()) {
                right = stackTree.top();
                stackTree.pop();
                left = stackTree.top();
                stackTree.pop();
                if (left == NULL && right == NULL) {
                    continue;
                } else if (left == NULL || right == NULL) {
                    return false;
                } else {
                    if (right->val != left->val) {
                        return false;
                    }
                    stackTree.push(right->right);
                    stackTree.push(left->left);
                    stackTree.push(right->left);
                    stackTree.push(left->right);
                }
            }
            return true;
        }
        
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode