题目:https://leetcode-cn.com/contest/weekly-contest-178/problems/linked-list-in-binary-tree/
题意:
给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。
如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。
一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。
二叉树和链表中的每个节点的值都满足 1 <= node.val <= 100 。
链表包含的节点数目在 1 到 100 之间。
二叉树包含的节点数目在 1 到 2500 之间。
题解:爆搜会T。开一个数组,存每个树上节点,循环链表。对于当前树节点如果其值能匹配上当前链表值,则保留其孩子节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> tree,tree2;
void dfs(TreeNode *root) {
if(root == nullptr) return;
tree.push_back(root);
dfs(root->left);
dfs(root->right);
}
bool isSubPath(ListNode* head, TreeNode* root) {
tree.clear();
dfs(root);
while(head != nullptr) {
tree2.clear();
for(auto &v :tree) {
if(v->val == head->val) {
if(v->left != nullptr) tree2.push_back(v->left);
if(v->right != nullptr) tree2.push_back(v->right);
}
}
if(tree2.empty() && head->next != nullptr) return false;
tree.swap(tree2);
head = head->next;
}
return true;
}
};