每日一题2023.9.25|LeetCode1367.二叉树中的链表
最佳答案 问答题库658位专家为你答疑解惑
1367.二叉树中的链表
链接:LeetCode1367.二叉树中的链表
错误分析
其实这道题目思路很简单:
采用前序遍历的方式从根节点开始遍历二叉树,并在遍历的过程中比较与链表节点的值是否相等,如果当前链表节点的值和树节点的值相等,就在树节点的左右子树寻找下一个链表节点;如果不相等就在树节点的左右子树寻找当前链表节点的值;以下是根据这个思想写出的第一版代码:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
/*** 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 {
public:bool isSubPath(ListNode* head, TreeNode* root) {return backtracking(head,root);}
private:bool backtracking(ListNode*head,TreeNode *root){if(!head) return true;if(!root) return false;if(root->val==head->val){head=head->next;}if(backtracking(head,root->left)) return true;return backtracking(head,root->right);}
};
这个代码只能通过61/67的测试案例
其实我一开始检查代码的时候并没有发现有什么错误,感觉很符合逻辑,实在不明白哪里出错了。
后来我发现,我传递的参数是以指针的形式传递的,如果当前的链表节点的值与树节点的值相等,会做这么一个操作
if(head->val==root->val) head=head->next;
然后再将这个head传递给下一次递归,这个过程无意当中修改了链表中节点的指向,也就是无意中修改了链表的结构,所以针对某些案例得到了错误的答案。
后来我再次回想这版错误答案的时候,我发现错误之处并非像上述所说的那样,链表的结构不会因为传递的参数而被改变,就像遍历二叉树的时候,树的结构不会因为传递的参数而发生变化。
错误之处应该是:举个例子来说
假设链表的结构为4,2,1;树中包含链表路径的一个分支结构为4,2,8;当head指向1并且root指向8的时候,1!=8,此时会执行以下代码
if(backtracking(head,root->left)) return true;
这行代码的意思就是,在root[8]的左子树寻找以head[1]为头结点的链表,这个操作把链表进行了分割,所以导致结果错误。
正确解答
为了避免上述的错误,应该在遇到链表节点的值和当前树节点的值不相等的时候,就立马返回false。
在isSubPath()这个函数中,重新用树节点的左右子树与链表头结点进行匹配
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
/*** 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 {
public:bool isSubPath(ListNode* head, TreeNode* root) {if(!head) return true;if(!root) return false;//这个isSubPath之所以出现在||的后面是因为要找到当一个与head头匹配的root节点从当前位置开始向下寻找return backtracking(head,root) ||isSubPath(head,root->left)||isSubPath(head,root->right);}
private:bool backtracking(ListNode*head,TreeNode *root){if(!head) return true;if(!root) return false;if(root->val!=head->val) return false;return backtracking(head->next,root->left) || backtracking(head->next,root->right);}
};
99%的人还看了
相似问题
- 〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性
- Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)
- 代码随想录二刷 | 链表 | 删除链表的倒数第N个节点
- 节点导纳矩阵
- bhosts 显示节点 “unreach“ 状态
- 电子电器架构 —— 车载网关边缘节点总线转换
- 〖大前端 - 基础入门三大核心之JS篇㊳〗- DOM访问元素节点
- 第四天||24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
- CS224W5.1——消息传递和节点分类
- Vue报错解决Error in v-on handler: “Error: 无效的节点选择器:#div1“
猜你感兴趣
版权申明
本文"每日一题2023.9.25|LeetCode1367.二叉树中的链表":http://eshow365.cn/6-13966-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: [多态设计模式]枚举
- 下一篇: yolov8训练自己的数据集(标注到训练)