每日一题(13)

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的

思路:
1. 如果二叉树为空树,则是对称的
2. 从其子树开始检测,如果根的左右子树:
a. 根的左右子树均为空,则是对称的
b. 根的左右子树一棵为空,一棵不为空,则不对称
c. 根的左右子树都不为空,且左右子树根结点的值域不相等,则不对称
d. 再去递归检测根的左右子树的子树是否对称

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
     bool _isSymmerical(TreeNode *left,TreeNode *right)
    {
         // 如果根的左右子树均为空则对称
        if(left==NULL && right==NULL)
            return true;
         // 如果根的左走子树只有一个为空,则一定不对称
        if(left==NULL || right==NULL)
            return false;
         // 根的子树均不为空,根节点的左右子树根的值域如果不相等,则也不对称
        if(left->val!=right->val)
            return false;
         // 检测根的左右子树的子树是否是对称的
        return _isSymmerical(left->left,right->right) && _isSymmerical(left->right,right->left);
    }
    bool isSymmetrical(TreeNode *pRoot)
    {
         // 空树是对称的
        if(pRoot==NULL)
            return true;
         // 检测根的左右子树是否对称
        return _isSymmerical(pRoot->left,pRoot->right);
    }
};

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int>> ret;
            if(NULL == pRoot)
                return ret;

            queue<TreeNode*> q;
            q.push(pRoot);
            while(!q.empty())
            {
                vector<int> level;
                size_t size = q.size();
                level.resize(size);
                TreeNode* pCur;
                for(size_t i = 0; i < size; ++i)
                {
                    pCur = q.front();
                    level[i] = pCur->val;

                    if(pCur->left)
                        q.push(pCur->left);

                    if(pCur->right)
                        q.push(pCur->right);

                    q.pop();
                }

                ret.push_back(level);
            }

            return ret;
        }
};

猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/81841692
今日推荐