簡體   English   中英

使用BFS時N元樹的最大深度

[英]Maximum Depth of N-ary Tree when use BFS

為了獲得一棵nary樹的最大深度,下面的代碼是正確的答案。

var maxDepth = function(root) {
 if (!root) {
    return 0
 }
 let depth = 0;
 let arr=[root];

 while (arr.length) {
    let arrlength=arr.length;
    for (let i=0;i<arrlength;i++) {
        let curr=arr.shift();
        arr.push(...curr.children);           
    }
    depth++;
 }
 return depth;

};

但是,如果我在for循環中使用arr.length而不是使用“ let arrlength = arr.length;” 並使用arrlength,這將是一個錯誤的答案...我可以知道為什么嗎? 我說不出任何區別。 非常感謝!

var maxDepth = function(root) {
 if (!root) {
    return 0
 }
 let depth = 0;
 let arr=[root];

 while (arr.length) {       
    for (let i=0;i<arr.length;i++) {
        let curr=arr.shift();
        arr.push(...curr.children);           
    }
    depth++;
 }
 return depth;

};

可以在這里進行測試: https//leetcode.com/problems/maximum-depth-of-n-ary-tree/

let curr = arr.shift()從數組中刪除第一個元素,並將其分配給curr

arr.push(...curr.children)將所有子項添加到數組的末尾。

這兩個操作都會改變數組的長度,並且每次測試i < arr.length使用當前長度。 但是循環僅應處理原始數組元素。 arrlength包含循環之前數組的原始長度。 修改數組后它不會改變,因此循環將操作正確的次數。

如果在循環之前制作了arr的副本,並在其上循環而不是修改要循環的數組,則可以在循環中使用.length

 var maxDepth = function(root) { if (!root) { return 0 } let depth = 0; let arr = [root]; while (arr.length) { let copy = [...arr]; arr.splice(0, arr.length); for (let i = 0; i < copy.length; i++) { let curr = copy[i]; arr.push(...curr.children); } depth++; } return depth; }; const tree = { value: 1, children: [{ value: 3, children: [{ value: 5, children: [] }, { value: 6, children: [] }] }, { value: 2, children: [] }, { value: 3, children: [] } ] }; console.log(maxDepth(tree)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM