算法 求二叉树根节点到指定节点的路径
@author:Jingdai
@date:2020.11.05
题目描述
给你一个棵二叉树,再给你一个指定的节点,求根节点到指定节点的路径。
如图,比如让你求到 4 节点的路径,则应该返回的路径为
[0, 1, 4]
。
思路
利用二叉树的先序遍历,寻找指定的节点,同时用一个栈 stack
记录遍历到的节点,当找到需要的节点后立即返回结果。但是这样有一个问题,就是在遍历中 stack
记录的路径中包含一些其他的节点,比如要求上图中到 4 节点的路径,则遍历到 4 节点时,stack
中的路径就为 [0, 1, 3, 5, 6, 7, 8, 4]
,而需要的路径为 [0, 1, 4]
,中间多了许多不需要的节点。
为了去掉 stack
中不需要的节点,需要在递归查找过程中进行回溯,pop
这些不需要的节点。先序遍历查找是先看根节点是否满足要求、若不满足要求再去左子树和右子树中去查找,如果右子树还是找不到,说明该节点不在路径中,需要弹出该节点。
综上,代码片段如下:
public static boolean getPathToTarget(TreeNode node, TreeNode target,
LinkedList<TreeNode> path) {
if (node == null)
return false;
path.push(node);
if (node == target)
return true;
// find in left tree
if (getPathToTarget(node.left, target, path))
return true;
// find in right tree
if (getPathToTarget(node.right, target