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

二叉树——对称二叉树

作者: 水橋美咲 | 来源:发表于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;
        }
    };
    

    相关文章

      网友评论

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

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