深度優(yōu)先遍歷:863. 二叉樹中所有距離為 K 的結(jié)點(diǎn)(中等)

定一個(gè)二叉樹(具有根結(jié)點(diǎn)?root),?一個(gè)目標(biāo)結(jié)點(diǎn)?target?,和一個(gè)整數(shù)值 K 。

返回到目標(biāo)結(jié)點(diǎn) target 距離為 K 的所有結(jié)點(diǎn)的值的列表。 答案可以以任何順序返回。

示例 1:輸入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2

? ? ? ? ? ? ? 輸出:[7,4,1]

解釋:? 所求結(jié)點(diǎn)為與目標(biāo)結(jié)點(diǎn)(值為 5)距離為 2 的結(jié)點(diǎn),

? ? ? ? ? ? ?值分別為 7,4,以及 1


解題思路:?target 已知,從target 出發(fā),使用深度優(yōu)先搜索去尋找與target 距離為 k 的所有結(jié)點(diǎn),即深度為 k 的所有結(jié)點(diǎn)。

? ? ? ? ? ? ? ? ? ?可知要尋找與target距離為k的結(jié)點(diǎn),不應(yīng)該只往子節(jié)點(diǎn)深度遍歷,也要去深度遍歷父節(jié)點(diǎn)。

? ? ? ? ? ? ? ? ? ?用一個(gè)哈希表記錄每個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn), 即創(chuàng)建hashMap,key表示子節(jié)點(diǎn)的值,value表示該子節(jié)點(diǎn)對(duì)應(yīng)的父節(jié)點(diǎn)。

? ? ? ? ? ? ? ? ? ?因?yàn)榧幢闅v子節(jié)點(diǎn)也遍歷父節(jié)點(diǎn),可能會(huì)重復(fù)訪問(wèn)結(jié)點(diǎn),為避免在深度優(yōu)先搜索時(shí)重復(fù)訪問(wèn)結(jié)點(diǎn),遞歸時(shí)額外傳入來(lái)源結(jié)點(diǎn)from,在遞歸前比較目標(biāo)結(jié)點(diǎn)是否與來(lái)源結(jié)點(diǎn)相同,不同的情況下才進(jìn)行遞歸。

class?Solution?{

????Map<Integer,?TreeNode>?hashParent?=?new?HashMap<Integer,?TreeNode>(); // 哈希表記錄每個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn)

????List<Integer>?returnList?=?new?ArrayList<Integer>(); //要返回的所有的節(jié)點(diǎn)的值,即到target距離為K的所有結(jié)點(diǎn)

????public?List<Integer>?distanceK(TreeNode?root,?TreeNode?target,?int?k)?{

????????findParent(root);

????????findReturnList(target,?null,?0,?k);

????????return?returnList;

????}

????public?void?findParent(TreeNode?node)?{ // 創(chuàng)建子節(jié)點(diǎn)-父節(jié)點(diǎn)hash表

????????if?(node.left?!=?null)?{

????????????hashParent.put(node.left.val,?node);

????????????findParent(node.left);

????????}

????????if?(node.right?!=?null)?{

????????????hashParent.put(node.right.val,?node);

????????????findParent(node.right);

????????}

????}

????public?void?findReturnList(TreeNode?root,?TreeNode?from,?int?depth,?int?k)?{ // 深度優(yōu)先遍歷

????????if(root?==?null)?{? //遍歷到空結(jié)點(diǎn),停止遍歷;

????????????return;

????????}

????????if(depth?==?k)?{ //遍歷到深度為k,停止遍歷;

????????????returnList.add(root.val);

????????????return;

????????}

????????if(root.left?!=?from)?{ //即將要訪問(wèn)的左節(jié)點(diǎn)不是來(lái)源結(jié)點(diǎn)from

????????????findReturnList(root.left,?root,?depth+1,?k); //深度遍歷左節(jié)點(diǎn)

????????}

????????if(root.right?!=?from)?{? //即將要訪問(wèn)的右節(jié)點(diǎn)不是來(lái)源結(jié)點(diǎn)from

????????????findReturnList(root.right,?root,?depth+1,?k);? //深度遍歷右節(jié)點(diǎn)

????????}

????????if(hashParent.get(root.val)?!=?from)?{? ?//即將要訪問(wèn)的父節(jié)點(diǎn)節(jié)點(diǎn)不是來(lái)源結(jié)點(diǎn)from

????????????findReturnList(hashParent.get(root.val),?root,?depth+1,?k); // //深度遍歷父節(jié)點(diǎn)

????????}

????}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容