首页 > 其他 > 详细

【剑指offer】【树】28.对称的二叉树

时间:2020-04-08 22:26:19      阅读:71      评论:0      收藏:0      [点我收藏+]

对称的二叉树

递归

判断A的右子树和B的左子树是否对称
判断A的左子树和B的右子树是否对称
递归终止条件
1. 都为空指针,返回true
2. 只有一个为空,返回false
3. 两个指针当前节点值不相等,返回false

/**
 * 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) {
        bool res = true;
        if(root != nullptr) res = func(root->left,root->right);
        return res;
    }

    bool func(TreeNode*A, TreeNode* B)
    {
        // 先写递归终止条件
        if (A==NULL && B==NULL)
            return true;
        // 如果其中之一为空,也不是对称的
        if (A==NULL || B==NULL)
            return false;
        // 走到这里二者一定不为空
        if (A->val != B->val)
            return false;
        // 前序遍历
        return func(A->left,B->right) && func(A->right,B->left);
    }

};

迭代法

使用队列进行迭代,两个相邻的节点应该相等,入队是先把左子树的左孩子,右子树的右孩子入队;再将左子树的右孩子,右子树的左孩子入队;第一次入队元素为根节点的左右节点
/**
 * 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;
        //用队列保存节点
        queue<TreeNode*> q;
        //将根节点的左右孩子放到队列中
        q.push(root->left);
        q.push(root->right);
        while(!q.empty())
        {
            //从队列中取出两个节点,再比较这两个节点
            TreeNode* A = q.front();
            q.pop();
            TreeNode* B = q.front();
            q.pop();
            //如果两个节点都为空就继续循环,两者有一个为空就返回false
            if (A==NULL && B==NULL)
                continue;
            if (A==NULL || B==NULL)
                return false;
            if (A->val != B->val)
                return false;
            //将左子树的左孩子, 右子树的右孩子放入队列
            q.push(A->left);
            q.push(B->right);
            //将左子树的右孩子,右子树的左孩子放入队列
            q.push(A->right);
            q.push(B->left);
        }
        return true;
    }
};

【剑指offer】【树】28.对称的二叉树

原文:https://www.cnblogs.com/Trevo/p/12662681.html

(1)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!