自我修炼_初级算法篇_leetcode_第28题

对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:


输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:

 


输入:root = [1,2,2,null,3,null,3]
输出:false

 

提示:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
 

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn7ihv/
首先这道题我第一个想法是,是否可以中序遍历,然后双指针问题解决它。

当树是满二叉树时,这样的方法是可行的,但如果如实例2中的树,中序遍历就不可行了。

那就递归咯。首先他要是对称的。以三层为例。也就是我们第二层的左右节点,左节点的右孩子节点的值要等于右节点的左孩子的值,左孩子的左节点的值要等于右节点右孩子的值。

递归出口是,如果左右节点为空return true

如果左右节点不等直接return false

最后一个就是左右相等且左节点的右孩子等于右节点的左孩子,左节点的左孩子等于右节点的右孩子。


class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        return digui(root,root);
    }
    bool digui(TreeNode* left,TreeNode* right){
        if(!left && !right){
            return true;
        }
        if(!left || !right){
            return false;
        }
        return right->val == left->val && digui(left->right,right->left)&& digui(left->left,right->right);
    }
};

 第二种方法是使用迭代的方法将他放入一个队列。这里引用一下他人的代码。

扫描他的左子树和右子树。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        queue<TreeNode*> que;
        que.push(root->left);   // 将左子树头结点加入队列
        que.push(root->right);  // 将右子树头结点加入队列
        while (!que.empty()) {  // 接下来就要判断这这两个树是否相互翻转
            TreeNode* leftNode = que.front(); que.pop();
            TreeNode* rightNode = que.front(); que.pop();
            if (!leftNode && !rightNode) {  // 左节点为空、右节点为空,此时说明是对称的
                continue;
            }

            // 左右一个节点不为空,或者都不为空但数值不相同,返回false
            if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {
                return false;
            }
            que.push(leftNode->left);   // 加入左节点左孩子
            que.push(rightNode->right); // 加入右节点右孩子
            que.push(leftNode->right);  // 加入左节点右孩子
            que.push(rightNode->left);  // 加入右节点左孩子
        }
        return true;
    }
};

作者:carlsun-2
链接:https://leetcode-cn.com/problems/symmetric-tree/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-er-ch-hnjo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值