成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說你對樹的理解?相關的操作有哪些?

開發 架構
在計算機領域,樹形數據結構是一類重要的非線性數據結構,可以表示數據之間一對多的關系。以樹與二叉樹最為常用,直觀看來,樹是以分支關系定義的層次結構。

[[425982]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

在計算機領域,樹形數據結構是一類重要的非線性數據結構,可以表示數據之間一對多的關系。以樹與二叉樹最為常用,直觀看來,樹是以分支關系定義的層次結構

二叉樹滿足以下兩個條件:

  • 本身是有序樹
  • 樹中包含的各個節點的度不能超過 2,即只能是 0、1 或者 2

如下圖,左側的為二叉樹,而右側的因為頭結點的子結點超過2,因此不屬于二叉樹:

同時,二叉樹可以繼續進行分類,分成了滿二叉樹和完成二叉樹:

滿二叉樹:如果二叉樹中除了葉子結點,每個結點的度都為 2

完成二叉樹:如果二叉樹中除去最后一層節點為滿二叉樹,且最后一層的結點依次從左到右分布

二、操作

關于二叉樹的遍歷,常見的有:

  • 前序遍歷
  • 中序遍歷
  • 后序遍歷
  • 層序遍歷

前序遍歷

前序遍歷的實現思想是:

  • 訪問根節點
  • 訪問當前節點的左子樹
  • 若當前節點無左子樹,則訪問當前節點的右子

根據遍歷特性,遞歸版本用代碼表示則如下:

  1. const preOrder = (root) => { 
  2.   if(!root){ return } 
  3.   console.log(root) 
  4.   preOrder(root.left
  5.   preOrder(root.right

如果不使用遞歸版本,可以借助棧先進后出的特性實現,先將根節點壓入棧,再分別壓入右節點和左節點,直到棧中沒有元素,如下:

  1. const preOrder = (root) => { 
  2.   if(!root){ return } 
  3.   const stack = [root] 
  4.   while (stack.length) { 
  5.     const n = stack.pop() 
  6.     console.log(n.val) 
  7.     if (n.right) { 
  8.       stack.push(n.right
  9.     } 
  10.     if (n.left) { 
  11.       stack.push(n.left
  12.     } 
  13.   } 

中序遍歷

前序遍歷的實現思想是:

  • 訪問當前節點的左子樹
  • 訪問根節點
  • 訪問當前節點的右子

遞歸版本很好理解,用代碼表示則如下:

  1. const inOrder = (root) => { 
  2.   if (!root) { return } 
  3.   inOrder(root.left
  4.   console.log(root.val) 
  5.   inOrder(root.right

非遞歸版本也是借助棧先進后出的特性,可以一直首先一直壓入節點的左元素,當左節點沒有后,才開始進行出棧操作,壓入右節點,然后有依次壓入左節點,如下:

  1. const inOrder = (root) => { 
  2.   if (!root) { return } 
  3.   const stack = [root] 
  4.   let p = root 
  5.   while(stack.length || p){ 
  6.     while (p) { 
  7.       stack.push(p) 
  8.       p = p.left 
  9.     } 
  10.     const n = stack.pop() 
  11.     console.log(n.val) 
  12.     p = n.right 
  13.   } 

后序遍歷

前序遍歷的實現思想是:

  • 訪問當前節點的左子樹
  • 訪問當前節點的右子
  • 訪問根節點

遞歸版本,用代碼表示則如下:

  1. const postOrder = (root) => { 
  2.   if (!root) { return } 
  3.   postOrder(root.left
  4.   postOrder(root.right
  5.   console.log(n.val) 
  6.  } 

后序遍歷非遞歸版本實際跟全序遍歷是逆序關系,可以再多創建一個棧用來進行輸出,如下:

  1. const preOrder = (root) => { 
  2.   if(!root){ return } 
  3.   const stack = [root] 
  4.   const outPut = [] 
  5.   while (stack.length) { 
  6.     const n = stack.pop() 
  7.     outPut.push(n.val) 
  8.     if (n.right) { 
  9.       stack.push(n.right
  10.     } 
  11.     if (n.left) { 
  12.       stack.push(n.left
  13.     } 
  14.   } 
  15.   while (outPut.length) { 
  16.     const n = outPut.pop() 
  17.     console.log(n.val) 
  18.   } 

層序遍歷

按照二叉樹中的層次從左到右依次遍歷每層中的結點

借助隊列先進先出的特性,從樹的根結點開始,依次將其左孩子和右孩子入隊。而后每次隊列中一個結點出隊,都將其左孩子和右孩子入隊,直到樹中所有結點都出隊,出隊結點的先后順序就是層次遍歷的最終結果

用代碼表示則如下:

  1. const levelOrder = (root) => { 
  2.     if (!root) { return [] } 
  3.     const queue = [[root, 0]] 
  4.     const res = [] 
  5.     while (queue.length) { 
  6.         const n = queue.shift() 
  7.         const [node, leval] = n 
  8.         if (!res[leval]) { 
  9.             res[leval] = [node.val] 
  10.         } else { 
  11.             res[leval].push(node.val) 
  12.         } 
  13.         if (node.left) { queue.push([node.left, leval + 1]) } 
  14.         if (node.right) { queue.push([node.right, leval + 1]) } 
  15.     } 
  16.     return res 
  17. }; 

三、總結

樹是一個非常重要的非線性結構,其中二叉樹以二叉樹最常見,二叉樹的遍歷方式可以分成前序遍歷、中序遍歷、后序遍歷

同時,二叉樹又分成了完成二叉樹和滿二叉樹

參考文獻

https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91

 

http://data.biancheng.net/view/27.html

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-09-26 10:57:16

集合操作場景

2021-08-20 08:33:19

操作系統OS

2021-11-25 10:18:42

RESTfulJava互聯網

2021-08-09 07:47:40

Git面試版本

2020-12-01 08:47:36

Java異常開發

2020-06-12 15:50:56

options前端服務器

2021-09-09 07:21:26

TypeScript 高級類型

2021-09-16 07:52:18

算法應用場景

2019-05-10 10:50:04

Spring AOPJDK動態代理CGLIB動態代理

2021-11-09 08:51:13

模式命令面試

2021-11-05 07:47:56

代理模式對象

2020-12-04 06:27:04

序列化面試官Java

2021-11-02 22:04:58

模式

2021-11-10 07:47:49

組合模式場景

2021-11-03 14:10:28

工廠模式場景

2021-08-16 08:33:26

git

2022-02-21 17:24:18

序列化對象存儲

2024-07-26 08:10:10

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-28 07:12:09

測試路徑
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩精品一区 | 久久久精品 | 久久精品一级 | 欧美激情久久久 | 九九久久这里只有精品 | 欧美日韩高清一区 | 色婷婷av久久久久久久 | 久久久青草婷婷精品综合日韩 | 亚洲乱码一区二区三区在线观看 | 欧美xxxx在线 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 毛片久久久 | 一级黄色生活视频 | 国产1区在线 | 91精品国产91久久综合桃花 | 中文字幕日韩欧美一区二区三区 | 久久免费香蕉视频 | 久久久久亚洲 | 日韩一区二区三区在线 | 欧美性精品 | 91精品国产综合久久婷婷香蕉 | 国产精品久久久久久久久久久免费看 | 国产免费一区二区三区最新6 | 久久不卡 | 欧美精品一区二区三区在线 | 涩涩导航 | 一区二区三区在线电影 | 视频一区二区中文字幕 | 一级a性色生活片久久毛片 午夜精品在线观看 | 九七午夜剧场福利写真 | 欧美aaa一级片 | 久久国产电影 | 男人的天堂一级片 | 国产一区二区三区四区五区加勒比 | 免费激情av | 欧美日韩三级 | 久久久久黑人 | 国产在线a视频 | 久久精品国产清自在天天线 | 成人午夜网站 | 美女福利网站 |