leetcode 863. 二叉树中所有距离为 K 的结点

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。

返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

 

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2
输出:[7,4,1]
解释:
所求结点为与目标结点(值为 5)距离为 2 的结点,
值分别为 7,4,以及 1

 leetcode 863. 二叉树中所有距离为 K 的结点

注意,输入的 "root" 和 "target" 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。
 

提示:

给定的树是非空的。
树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
目标结点 target 是树上的结点。
0 <= K <= 1000.
通过次数31,424提交次数52,194

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

1:首先遍历二叉树,找到目标值,并且用一个list来记录从根节点到目标节点的路径。

2:从后往前遍历list, 每一个节点到目标节点的距离都是其坐标的差值。

3:list的长度为size, 所以本地可以转换为:

寻找到list.get(size - 1) 节点 距离为 k的其子节点。

寻找到list.get(size - 2) 节点 距离为 k - 1的其子节点(不能包含 list.get(size - 1) 节点发分支)。

寻找到list.get(size - 3) 节点 距离为 k - 2的其子节点(不能包含 list.get(size - 2) 节点发分支)。

以此类推,从后往前遍历list,每次都寻找的距离k--。直到k 为0,或者到根节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        List<TreeNode> list = new ArrayList<>();
        List<Integer> values = new ArrayList<>();
        find(root, target, list);
        int size = list.size() - 1;
        TreeNode node;
        addValues(list.get(size), values, 0, k);
        int count = 2;
        for (int i = size; i > 0; i--) {
            if (count - 1 == k) {
                values.add(list.get(i - 1).val);
                break;
            }
            node = list.get(i);
            TreeNode treeNode = list.get(i - 1);
            if (treeNode.left == null || treeNode.right == null) {
                count++;
                continue;
            }
            if (node.val == treeNode.left.val) {
                addValues(treeNode.right, values, count++, k);
            } else {
                addValues(treeNode.left, values, count++, k);
            }
        }
        return values;
    }

    private void addValues(TreeNode node, List<Integer> values, int n, int k) {
        if (node == null) {
            return;
        }
        if (n == k) {
            values.add(node.val);
            return;
        }
        addValues(node.left, values, n + 1, k);
        addValues(node.right, values, n + 1, k);
    }


    private boolean find(TreeNode node, TreeNode target, List<TreeNode> list) {
        if (node == null) {
            return false;
        }
        list.add(node);
        if (target.val == node.val) {
            return true;
        }
        boolean b = find(node.left, target, list);
        if (b) {
            return b;
        }
        b = find(node.right, target, list);
        if (!b) {
            list.remove(list.size() - 1);
        }
        return b;
    }
}

leetcode 863. 二叉树中所有距离为 K 的结点

leetcode 863. 二叉树中所有距离为 K 的结点

上一篇:无参方法只能类调用吗?并不是


下一篇:docker安装