题目
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
题目传送门
思路
新开一个类型,存放当前节点和当前节点的路径和,并且新开一个hashmap,把当前的节点和对应的父节点以哈希表的形式存放到哈希表中,一旦遍历到了当前节点的路径和等于目标的路径和,那么就不断去获取它的父节点直到根节点,并且将路径加入到列表中即可!
代码
class Element
{
TreeNode node;
int sum;
public Element(TreeNode node,int sum)
{
this.node=node;
this.sum=sum;
}
}
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum)
{
List<List<Integer>> ans =new LinkedList<>();
if(root==null)
return ans;
// 子节点在前,父节点在后
HashMap<TreeNode,TreeNode>map = new HashMap<>();
map.put(root,null);
// 搜索队列
Queue<Element> queue = new LinkedList<>();
queue.add(new Element(root,root.val));
while(!queue.isEmpty())
{
Element element = queue.poll();
TreeNode temp = element.node;
TreeNode node =element.node; // 多获取一次当前节点,防止因为进入了目标路径而当前节点被改变造成下面的代码不符合逻辑的情况发生
if(temp.left==null && temp.right==null && element.sum==targetSum)
{
List<Integer> list = new LinkedList<>();
list.add(0,temp.val);
while(map.get(temp)!=null)
{
temp=map.get(temp);
list.add(0,temp.val);
}
ans.add(list);
}
if(node.left!=null)
{
map.put(node.left,node); // 存放父节点
queue.add(new Element(node.left,element.sum+node.left.val));
}
if(node.right!=null)
{
map.put(node.right,node); // 存放父节点
queue.add(new Element(node.right,element.sum+node.right.val));
}
}
return ans;
}
}
结果
a倒是a了,就是在利用当前节点不断去获取父节点的那个地方,那个当前节点最终会被改变!记得要多获取一个当前节点存储起来,以供下边的代码继续运行!