算法题31:对称的二叉树

该文章介绍了如何判断一棵二叉树是否对称,提供了递归和层序遍历两种解题思路。在递归方法中,通过比较根左右和根右左的顺序遍历结果。而在层序遍历中,利用队列保存结点,分三种情况判断对称性。代码示例展示了具体的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法题31:对称的二叉树

思路1:递归

分别按照根左右和根右左的顺序遍历二叉树,每个结点处均比较一次是否对称。

思路2:层序遍历

将原来的二叉树分为左右两个子树,分别借助一个队列来保存结点,包括NULL,比较对称的时候分三种情况:
1、两边都是NULL,弹出继续比较下一个结点;
2、只有一边为NULL或者两边结点值不等,不对称;
3、两边对称,将下一层结点加入队列,注意,左子树按从左到右加入队列,右子树按从右到左加入队列。

代码

bool isSymmetrical(TreeNode* pRoot) {
    //分别从左右开始层次遍历,对比节点值是否相同
    if(!pRoot) return true;

    queue<TreeNode*> ql;    //分别保存左右子树结点
    queue<TreeNode*> qr;

    ql.push(pRoot->left);
    qr.push(pRoot->right);
    while(!ql.empty() || !qr.empty()){
        TreeNode *nl = ql.front();
        TreeNode *nr = qr.front();
        ql.pop();
        qr.pop();
        // cout<<nl->val<<" "<<nr->val<<endl;
        if(!nl && !nr){
            //1、结点均不存在
            continue;
        }
        if(!nl || !nr || nl->val != nr->val){
            //2、两边不对称
            return false;
        }
        else{
            // 3、结点存在并相等,弹出队首结点,加入下一层结点
            ql.push(nl->left);
            ql.push(nl->right);
            qr.push(nr->right);
            qr.push(nr->left);
        }
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值