• 57对称的二叉树


    题目描述

    请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
     
    思路:分为递归和迭代版本。
    递归版本,这道题要理解题目意思,是左子树的左节点等于右子树的右节点才是对称的,自己写成了左子树的左节点和右节点是否相等了,需要一个递归的helper函数。比较的时候只比较返回false的情况就可以了。
    1)只有一个为空;
    2)两者不为空,但是两者值不相等。
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
        bool helper(TreeNode *Left,TreeNode *Right){
            if(Left == nullptr && Right== nullptr){
                return  true;
            }
            else if(Left == nullptr || Right == nullptr){
                return false;
            }
            else if(Left->val != Right->val){
                return  false;
            }
            return helper(Left->left,Right->right) && helper(Left->right,Right->left);
        }
        bool isSymmetrical(TreeNode* pRoot){
            if(pRoot == nullptr){
                return true;
            }   
            return helper(pRoot->left,pRoot->right);
        }
     
    };
    循环版本:
    使用一个栈,分别将左子树的左节点和右子树的右节点压入stack,然后将左子树的右节点和右子树的左节点压入栈。每次循环弹出两个元素看是否相等,是否为空的上面的判断。一定要注意两个都为空的时候要continue,后面压栈的时候需要访问左右节点。不continue的会访问空节点。
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };
    */
    class Solution {
    public:
        bool isSymmetrical(TreeNode* pRoot){
            if(pRoot == nullptr){
                return true;
            }
            stack<TreeNode*> s;
            TreeNode *p,*q;
            p = pRoot -> left;
            q = pRoot -> right;
            s.push(p),s.push(q);
            while(s.size() != 0){
                p = s.top(),s.pop();
                q = s.top(),s.pop();
                if(p == nullptr && q == nullptr){
                    continue;
                }
                if(p == nullptr || q == nullptr){
                    return false;
                }                        
                if(p->val != q->val){
                    return false;
                }            
                s.push(p->left),s.push(q->right);
                s.push(p->right),s.push(q->left);
            }
            return true;
        }
    
    };
     
  • 相关阅读:
    杭电 1013 Digital Roots
    杭电 1040 As Easy As A+B 【排序】
    杭电 2092 整数解
    bzoj3223
    bzoj3224
    LA3905
    bzoj3601
    bzoj1002
    bzoj3105
    bzoj3332
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8305040.html
Copyright © 2020-2023  润新知