一、先看懂题目
- 树结构
- public class TreeNode {
-
int val;
-
TreeNode left;
-
TreeNode right;
-
TreeNode(int x) { val = x; }
- }
二、分析:
解此题,首先target节点距离为k的节点可分为两部分,target上方的节点和下方的节点,对于target下方节点,通过广度遍历便可得到,对于上方节点需要找到父节点在进行深度遍历,此时进行遍历的时候,不需要遍历target节点一侧的子树。
第一步,首先需要遍历target上方的整个树,用map进行保存父节点和子节点的映射,因为需要用子节点找到父节点,所以key为子节点,value为父节点。
第二步,如果找距离targer层k步的节点,在target下方的需要查找的节点就在target下的第k层,通过深度遍历便可得到,对于target上方的节点,可以看作target的父辈节点的第k-i层,i为target与父辈节点的距离,此时访问时需要把target所在路径排除,这样就可以做出这道题
代码如下
class Solution {
Map<TreeNode,TreeNode > routeMap = new HashMap<>();
List<Integer> result = new ArrayList();
public void nodeConnect(TreeNode fatherNode,TreeNode tempNode){
routeMap.put(tempNode,fatherNode);
}
public void ergodic(TreeNode fatherNode,TreeNode tempNode){
if(tempNode == null) return ;
nodeConnect(fatherNode,tempNode);
fatherNode = tempNode;
ergodic(fatherNode,tempNode.left);
ergodic(fatherNode,tempNode.right);
}
public void seekNode(TreeNode srcNode,int k){
if(srcNode == null) return;
if(k == 0){
result.add(srcNode.val);
return;
}
seekNode(srcNode.left,k-1);
seekNode(srcNode.right,k-1);
}
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
TreeNode fatherNode = null;
ergodic(fatherNode,root);
seekNode(target,k);
fatherNode = routeMap.get(target);
while(k>=1 && fatherNode != null){
if(fatherNode.left == target){
fatherNode.left = null;
}else{
fatherNode.right = null;
}
seekNode(fatherNode,--k);
target = fatherNode;
fatherNode = routeMap.get(fatherNode);
}
return result;
}
}
执行用时:14 ms, 在所有 Java 提交中击败了76.52%的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了44.21%的用户
未到双百可以继续优化。