LeetCode 863. 二叉樹中所有距離為 K 的結點
阿新 • • 發佈:2019-02-03
最近刷LeetCode題目的一些思路,題目資訊
給定一個二叉樹(具有根結點 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 注意,輸入的 "root" 和 "target" 實際上是樹上的結點。 上面的輸入僅僅是對這些物件進行了序列化描述。
提示:
- 給定的樹是非空的,且最多有
K
- 樹上的每個結點都具有唯一的值
0 <= node.val <= 500
。 - 目標結點
target
是樹上的結點。 0 <= K <= 1000
.
--------------------------------------------------------------------------------------
因為目標結點可能位於任何位置,而二叉樹又是單向的,所以需要先將所有樹結點串聯起來,指明每一個結點的父結點,然後根據目標結點向其子結點父節點擴散查詢。
1. 整理資料,給每個結點指定父結點,然後儲存在Map中,供之後使用
private void setParentTreeNode(TreeNode root, Map<TreeNode,TreeNode> parentTreeNodeMap, TreeNode parent){ if(root == null){ return; } if(parent != null){ parentTreeNodeMap.put(root, parent); } setParentTreeNode(root.left,parentTreeNodeMap,root); setParentTreeNode(root.right,parentTreeNodeMap,root);}
2. 以目標結點為中心,進行擴散遍歷
public List<Integer> distanceK(TreeNode root, TreeNode target, int K) { List<Integer> retList=new ArrayList<>(); Map<TreeNode,TreeNode> parentsTreeMap=new HashMap<>(); setParentTreeNode(root, parentsTreeMap,null); Queue<TreeNode> checkQueue=new LinkedList<>(); checkQueue.add(target); Set<TreeNode> hasCheck=new HashSet<>(); hasCheck.add(target); while(!checkQueue.isEmpty()&&K>0){ K--; int size=checkQueue.size(); for(int i=0; i<size; i++){ TreeNode treeNode=checkQueue.poll(); if (treeNode.left != null && hasCheck.add(treeNode.left)) checkQueue.add(treeNode.left); if (treeNode.right != null && hasCheck.add(treeNode.right)) checkQueue.add(treeNode.right); if (parentsTreeMap.containsKey(treeNode) && hasCheck.add(parentsTreeMap.get(treeNode))) checkQueue.add(parentsTreeMap.get(treeNode)); } } while (!checkQueue.isEmpty()){ retList.add(checkQueue.poll().val); } return retList; }