记leetcode一个奇怪bug

这篇博客讲述了在二叉树中寻找从根节点到叶子节点且节点值之和等于目标和的路径问题。作者通过使用栈实现了一种解决方案,但遇到了运行时错误,最终发现是由于内存对齐问题导致。在修复后,程序成功通过了测试。博客强调了在LeetCode等平台做题时需要注意资源管理和细节处理。
摘要由CSDN通过智能技术生成

题目描述:

  1. 路径总和
    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。


问题描述

很简单的题.........

顺手写的出入栈,属实没必要,但是样例都过了

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    private:
    int res;
    stack<TreeNode*> road={};
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(!root)
        {
            return false;
        }

        if(!root->left&&!root->right)
        {
            return root->val==targetSum?true:false;
        }
        res=false;
        stack<TreeNode*> road;
        instack(root,targetSum);
        //此处加入
        return res;

    }

    void instack(TreeNode* r,int t)
    {
        // stack<int> road;
        if(!res)
        {
                    road.push(r);
                    int te=t-(r->val);
            

            if(r->left&&r->right)
            {

                instack(r->left,te);
                road.pop();
                instack(r->right,te);
                            road.pop();

                return;

            }
            else if(r->left)
            {
                instack(r->left,te);
                            road.pop();

                return;
            }
            else if(r->right)
            {
                instack(r->right,te);
                            road.pop();

                return;
            }
            else if(!r->left&&!r->right&&te!=0)
            {
                road.pop();
                return;
            }
            else if(!r->left&&!r->right&&te==0)
            {
                res=true;
                road.pop();
                return;
            }
        }
        else 
        return;

    }
};
	

实际上出入栈和建立栈的内容一注释就通过了,不过题主之前在做工程,脑子有点昏,实际上 加上栈也是ok的,出现以下问题:

执行出错信息:
Line 138: Char 23: runtime error: constructor call on misaligned address 0xbebebebebebec0b6 for type ‘TreeNode *’, which requires 8 byte alignment (new_allocator.h)
0xbebebebebebec0b6: note: pointer points here

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/…/lib/gcc/x86_64-linux-gnu/9/…/…/…/…/include/c++/9/ext/new_allocator.h:147:23
最后执行的输入:
[1,-2,-3,1,3,-2,null,-1]
3

题主人麻了,百度也没结果,推了以下发现没啥问题.

原因分析:

后来题主猜测:
第138行:Char 23:运行时错误:构造函数调用类型“TreeNode*”的未对齐地址0xbe0b6,该类型需要8字节对齐(new_allocator.h)

是不是没释放完所有资源啊…还有头节点,于是题主在 return 前 加上
road.pop(),然后通过了…呵呵


总结:

leetcode判断题的机制需要时刻注意,特别对于一些资源的 初始化 回收问题
那你麻麻的 链表题也没让 释放 删除的节点 啊!!!
我就草了!!!

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值