题目描述:
- 路径总和
给你二叉树的根节点 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判断题的机制需要时刻注意,特别对于一些资源的 初始化 回收问题
那你麻麻的 链表题也没让 释放 删除的节点 啊!!!
我就草了!!!