题解 | #距离是K的二叉树节点#

距离是K的二叉树节点

https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622

题目里没说明的一点是输出结果的顺序, 这个还得自己看样例来猜。

整体思路是先遍历一遍二叉树, 一边记录下每个节点的父节点, 一边找到目标节点。

找到目标节点之后, 先左后右最后根的顺序开始递归找距离为k的节点即可。

import java.util.*;

public class Solution {
    Map<TreeNode, TreeNode> parentMap = new HashMap<>();

    ArrayList<Integer> res = new ArrayList<>();

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param root TreeNode类
     * @param target int整型
     * @param k int整型
     * @return int整型一维数组
     */
    public ArrayList<Integer> distanceKnodes(TreeNode root, int target, int k) {
        ArrayDeque<TreeNode> queue = new ArrayDeque<>();
        TreeNode targetNode = null;
        queue.addFirst(root);
        while (!queue.isEmpty()) {
            TreeNode curRoot = queue.pollLast();
            TreeNode cLeft = curRoot.left;
            TreeNode cRight = curRoot.right;
            if (cLeft != null) {
                if (cLeft.val == target) {
                    targetNode = cLeft;
                }
                queue.addFirst(cLeft);
                parentMap.put(cLeft, curRoot);
            }
            if (cRight != null) {
                if (cRight.val == target) {
                    targetNode = cRight;
                }
                queue.addFirst(cRight);
                parentMap.put(cRight, curRoot);
            }
        }
        if (root.val == target) { // 如果根就是目标节点的话,上边是没遍历到的..
            targetNode = root;
        }
        if (targetNode == null) {
            return new ArrayList<>();
        }
        HashSet<TreeNode> usedNodesSet = new HashSet<>();
        findK(targetNode, usedNodesSet, k);
        return res;
    }

    private void findK(TreeNode curNode, HashSet<TreeNode> usedNodesSet, int k) {
        if (curNode == null || usedNodesSet.contains(curNode)) {
            return;
        }
        usedNodesSet.add(curNode);
        if (k == 0) {
            res.add(curNode.val);
            return;
        }
        findK(curNode.left, usedNodesSet, k - 1);
        findK(curNode.right, usedNodesSet, k - 1);
        findK(parentMap.get(curNode), usedNodesSet, k - 1);
    }
}

全部评论

相关推荐

05-03 12:45
西南大学 Java
sdgfdv:你这项目写的内容太多了,说实话都是在给自己挖坑,就算简历过了,后面面试也难受
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务