[面試] 手寫題-數組轉樹

示例數據:

const arr = [{ id: 1, parentId: null, name: 'Root' },{ id: 2, parentId: 1, name: 'Child 1' },{ id: 3, parentId: 1, name: 'Child 2' },{ id: 4, parentId: 2, name: 'Grandchild 1' },
]

目標生成:

const tree = [{id: 1,name: 'Root',children: [{id: 2,name: 'Child 1',children: [{ id: 4, name: 'Grandchild 1', children: [] }],},{id: 3,name: 'Child 2',children: [],},],},
]

遞歸

function arrayToTree(arr, pid) {let res = [];arr.forEach((item) => {// parentId 等于null即為根節點if (item.parentId === pid) {// 遞歸查找當前節點的所有子節點const children = arrayToTree(arr, item.id);item.children = children;res.push(item);}});return res;
}let result = arrayToTree(arr, null)
console.log(result);

時間復雜度較高O(n^2)

Map

時間復雜度O(n)

function arrayToTree(arr) {const map = new Map();// 使用Map,查找父節點時間復雜度為O(1)const res = []; // 返回根節點數組// 第一次遍歷:將所有節點存入Map(id作為鍵,節點對象作為值)for (const item of arr) {map.set(item.id, item);// 注意:這里存儲的是原始對象的引用}// 第二次遍歷:構建樹結構for (const item of arr) {if (item.parentId=== null) { // 根節點res.push(item);} else { // 有父節點,// 查找當前節點的父節點const parent = map.get(item.parentId);if (!parent.children) {parent.children = [];}// 將當前節點添加到父節點的children數組parent.children.push(item);}}return res; 
}

避免修改原始數據的一版本

// 此版本通過創建節點副本避免修改原始數據,
function arrayToTree(arr) {const map = new Map();const res = [];// 第一步:創建所有節點的副本(含children屬性)for (const item of arr) {// 使用展開運算符{...item}創建淺拷貝,避免直接修改原始數據map.set(item.id, { ...item, children: [] });}// 第二步:構建樹結構for (const item of arr) {// 從Map獲取當前節點對應的副本,注意:這里使用副本節點而非原始數據const node = map.get(item.id); if (item.parentId === null) { // 根節點res.push(node);} else {// 獲取父節點副本const parent = map.get(item.parentId);// 將當前節點添加到父節點的children數組parent.children.push(node); }}  return res;
}

參考:

大廠JS筆試__數組與樹互轉

高頻面試題:樹結果轉為數組,數組轉為樹(詳細解答,性能提升之王)

大廠JS筆試__數組與樹互轉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912585.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全報告》(附報告全文鏈接)

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全報告》現已發布,報告顯示:僅2025年上半年,因安全事件導致的損失接近25億美元;截至目前,總損失已超過去年全年水平。整體來看,Web3.0安全形勢依…

反向傳播 梯度消失

反向傳播 backpropagation 反向傳播(Backpropagation) 是神經網絡訓練中的一種核心算法,用于通過計算誤差并將其傳播回網絡,從而更新神經網絡的參數。通過反向傳播,網絡能夠在每次迭代中逐步調整其參數(例…

京東外賣服務商加入方案對比!選擇本地生活服務商系統的優勢,到底在哪?

自入局之日起,京東外賣似乎就一直熱衷于給人驚喜: 先是在上線時規定了“2025年5月1日前入駐的商家,全年免傭金”和“僅限品質堂食商家入駐”; 再是宣布了要為外賣騎手繳納五險一金,并承擔其中的所有成本;…

【RTSP從零實踐】4、使用RTP協議封裝并傳輸AAC

😁博客主頁😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客內容🤑:🍭嵌入式開發、Linux、C語言、C、數據結構、音視頻🍭 🤣本文內容🤣&a…

Bootstrap 安裝使用教程

一、Bootstrap 簡介 Bootstrap 是一個開源的前端框架,由 Twitter 開發,旨在快速開發響應式、移動優先的 Web 頁面。它包含 HTML、CSS 和 JavaScript 組件,如按鈕、導航欄、表單等。 二、Bootstrap 安裝方式 2.1 使用 CDN(推薦入…

Java學習第二部分——基礎語法

目錄 一.數據類型 (一)數值類型(用于存儲數字,包括整數和浮點數) 1. **整數類型** 2. **浮點類型** (二)非數值類型(非數值類型用于存儲非數字數據) 1. **char** 2…

Redis分布式鎖核心原理源碼

文章目錄 概述一、Redis實現分布式鎖1.1、第一版1.2、第二版1.3、第三版1.3、第四版 二、Redisson實現分布式鎖核心源碼分析2.1、加鎖核心源碼2.2、鎖續期核心源碼2.3、重試機制核心源碼2.4、解鎖核心源碼 總結 概述 傳統的單機鎖(Synchronized,Reentran…

關于vue2使用elform的rules校驗

在使用vue2開發項目的時候使用element組件的el-form大多數情況都需要用到必填項校驗 舉個栗子&#xff1a; <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><e…

langchain從入門到精通(二十六)——RAG優化策略(四)問題分解策略提升負責問題檢索準確率

1. LangChain 少量示例提示模板 在與 LLM 的對話中&#xff0c;提供少量的示例被稱為 少量示例&#xff0c;這是一種簡單但強大的指導生成的方式&#xff0c;在某些情況下可以顯著提高模型性能&#xff08;與之對應的是零樣本&#xff09;&#xff0c;少量示例可以降低 Prompt…

Nuxt.js基礎(Tailwind基礎)

??1. 按鈕組件實現?? ??傳統 CSS <!-- HTML --> <button class"btn-primary">提交</button><!-- CSS --> <style>.btn-primary {background-color: #3490dc;padding: 0.5rem 1rem;border-radius: 0.25rem;color: white;transi…

[C語言]存儲結構詳解

C語言存儲結構總結 在C語言中&#xff0c;數據根據其類型和聲明方式被存儲在不同的內存區域。以下是各類數據存儲位置的詳細總結&#xff1a; 內存五大分區 存儲區存儲內容生命周期特點代碼區(.text)程序代碼(機器指令)整個程序運行期只讀常量區(.rodata)字符串常量、const全…

【實戰】 容器中Spring boot項目 Graphics2D 畫圖中文亂碼解決方案

場景 架構&#xff1a;spring boot 容器技術&#xff1a;docker 服務器&#xff1a;阿里云 開發環境&#xff1a;windows10 IDEA 一、問題 服務器中出現Graphics2D 畫圖中文亂碼 本地環境運行正常 二、原因 spring boot 容器中沒有安裝中文字體 三、解決方案 安裝字體即可 …

深入淺出:Vue2 數據劫持原理剖析

目錄 一、什么是數據劫持&#xff1f; 二、核心 API&#xff1a;Object.defineProperty 三、Vue2 中的數據劫持實現 1. 對象屬性的劫持 2. 嵌套對象的處理 3. 數組的特殊處理 四、結合依賴收集的完整流程 五、數據劫持的局限性 六、Vue3 的改進方案 總結 一、什么是數…

數據湖 vs 數據倉庫:數據界的“自來水廠”與“瓶裝水廠”?

數據湖 vs 數據倉庫&#xff1a;數據界的“自來水廠”與“瓶裝水廠”&#xff1f; 說起“數據湖”和“數據倉庫”&#xff0c;很多剛入行的朋友都會覺得&#xff1a; “聽起來好高大上啊&#xff01;但到底有啥區別啊&#xff1f;是湖更大還是倉庫更高端&#xff1f;” 我得說…

Node.js-path模塊

Path 模塊 path 模塊提供了 操作路徑 的功能&#xff0c;我們將介紹如下幾個較為常用的幾個 API ??path.resolve([…paths]) 將路徑片段??解析為絕對路徑??&#xff08;從右向左拼接&#xff0c;遇到絕對路徑停止&#xff09; // 若參數為空&#xff0c;返回當前工作目…

Java面試題029:一文深入了解MySQL(1)

歡迎大家關注我的專欄,該專欄會持續更新,從原理角度覆蓋Java知識體系的方方面面。 一文吃透JAVA知識體系(面試題)https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7521898&

vue3.0所采用得Composition Api與Vue2.XOtions Api有什么不同?

Vue 3.0 引入的 Composition API 相較于 Vue 2.x 的 Options API 有顯著的不同。下面從幾個方面對比這兩者的差異&#xff1a; ? 1. 代碼組織方式不同 Vue 2.x — Options API 使用 data、methods、computed、watch 等分散的選項組織邏輯。 每個功能點分散在不同的選項中&am…

【IP 潮玩行業深度研究與學習】

潮玩行業發展趨勢分析&#xff1a;全球市場格局與中國政策支持體系 潮玩產業正經歷從"小眾收藏"到"大眾情緒消費"的深刻轉型&#xff0c;2025年中國潮玩市場規模已達727億元&#xff0c;預計2026年將突破1100億元&#xff0c;年復合增長率高達26%。這一千…

進程通信-消息隊列

消息隊列允許一個進程將一個消息發送到一個隊列中&#xff0c;另一個進程從該隊列中接收這個消息。 使用流程&#xff1a; 寫端&#xff1a; 使用結構體 mq_attr 設置消息隊列屬性&#xff0c;有四個選項&#xff1a; long mq_flags; // 隊列屬性: 0 表示阻塞 long …

串行通信接口USART,printf重定向數據發送,輪詢和中斷實現串口數據接收

目錄 UART通信協議的介紹 實現串口數據發送 CubeMX配置 printf重定向代碼編寫 實現串口數據接收 輪詢方式實現串口數據接收 接收單個字符 接收不定長字符串&#xff08;接收的字符串以\n結尾&#xff09; 中斷方式實現串口數據接收 CubeMX配置 UART中斷方式接收數據…