偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面試官:說(shuō)說(shuō)你對(duì)樹(shù)的理解?相關(guān)的操作有哪些?

開(kāi)發(fā) 架構(gòu)
在計(jì)算機(jī)領(lǐng)域,樹(shù)形數(shù)據(jù)結(jié)構(gòu)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),可以表示數(shù)據(jù)之間一對(duì)多的關(guān)系。以樹(shù)與二叉樹(shù)最為常用,直觀看來(lái),樹(shù)是以分支關(guān)系定義的層次結(jié)構(gòu)。

[[425982]]

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

一、是什么

在計(jì)算機(jī)領(lǐng)域,樹(shù)形數(shù)據(jù)結(jié)構(gòu)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),可以表示數(shù)據(jù)之間一對(duì)多的關(guān)系。以樹(shù)與二叉樹(shù)最為常用,直觀看來(lái),樹(shù)是以分支關(guān)系定義的層次結(jié)構(gòu)

二叉樹(shù)滿足以下兩個(gè)條件:

  • 本身是有序樹(shù)
  • 樹(shù)中包含的各個(gè)節(jié)點(diǎn)的度不能超過(guò) 2,即只能是 0、1 或者 2

如下圖,左側(cè)的為二叉樹(shù),而右側(cè)的因?yàn)轭^結(jié)點(diǎn)的子結(jié)點(diǎn)超過(guò)2,因此不屬于二叉樹(shù):

同時(shí),二叉樹(shù)可以繼續(xù)進(jìn)行分類,分成了滿二叉樹(shù)和完成二叉樹(shù):

滿二叉樹(shù):如果二叉樹(shù)中除了葉子結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)的度都為 2

完成二叉樹(shù):如果二叉樹(shù)中除去最后一層節(jié)點(diǎn)為滿二叉樹(shù),且最后一層的結(jié)點(diǎn)依次從左到右分布

二、操作

關(guān)于二叉樹(shù)的遍歷,常見(jiàn)的有:

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

前序遍歷

前序遍歷的實(shí)現(xiàn)思想是:

  • 訪問(wèn)根節(jié)點(diǎn)
  • 訪問(wèn)當(dāng)前節(jié)點(diǎn)的左子樹(shù)
  • 若當(dāng)前節(jié)點(diǎn)無(wú)左子樹(shù),則訪問(wèn)當(dāng)前節(jié)點(diǎn)的右子

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

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

如果不使用遞歸版本,可以借助棧先進(jìn)后出的特性實(shí)現(xiàn),先將根節(jié)點(diǎn)壓入棧,再分別壓入右節(jié)點(diǎn)和左節(jié)點(diǎn),直到棧中沒(méi)有元素,如下:

  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.   } 

中序遍歷

前序遍歷的實(shí)現(xiàn)思想是:

  • 訪問(wèn)當(dāng)前節(jié)點(diǎn)的左子樹(shù)
  • 訪問(wèn)根節(jié)點(diǎn)
  • 訪問(wèn)當(dāng)前節(jié)點(diǎn)的右子

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

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

非遞歸版本也是借助棧先進(jìn)后出的特性,可以一直首先一直壓入節(jié)點(diǎn)的左元素,當(dāng)左節(jié)點(diǎn)沒(méi)有后,才開(kāi)始進(jìn)行出棧操作,壓入右節(jié)點(diǎn),然后有依次壓入左節(jié)點(diǎn),如下:

  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.   } 

后序遍歷

前序遍歷的實(shí)現(xiàn)思想是:

  • 訪問(wèn)當(dāng)前節(jié)點(diǎn)的左子樹(shù)
  • 訪問(wèn)當(dāng)前節(jié)點(diǎn)的右子
  • 訪問(wèn)根節(jié)點(diǎn)

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

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

后序遍歷非遞歸版本實(shí)際跟全序遍歷是逆序關(guān)系,可以再多創(chuàng)建一個(gè)棧用來(lái)進(jìn)行輸出,如下:

  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.   } 

層序遍歷

按照二叉樹(shù)中的層次從左到右依次遍歷每層中的結(jié)點(diǎn)

借助隊(duì)列先進(jìn)先出的特性,從樹(shù)的根結(jié)點(diǎn)開(kāi)始,依次將其左孩子和右孩子入隊(duì)。而后每次隊(duì)列中一個(gè)結(jié)點(diǎn)出隊(duì),都將其左孩子和右孩子入隊(duì),直到樹(shù)中所有結(jié)點(diǎn)都出隊(duì),出隊(duì)結(jié)點(diǎn)的先后順序就是層次遍歷的最終結(jié)果

用代碼表示則如下:

  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. }; 

三、總結(jié)

樹(shù)是一個(gè)非常重要的非線性結(jié)構(gòu),其中二叉樹(shù)以二叉樹(shù)最常見(jiàn),二叉樹(shù)的遍歷方式可以分成前序遍歷、中序遍歷、后序遍歷

同時(shí),二叉樹(shù)又分成了完成二叉樹(shù)和滿二叉樹(shù)

參考文獻(xiàn)

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

 

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

 

責(zé)任編輯:武曉燕 來(lái)源: JS每日一題
相關(guān)推薦

2021-09-26 10:57:16

集合操作場(chǎng)景

2021-08-20 08:33:19

操作系統(tǒng)OS

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)

2021-08-09 07:47:40

Git面試版本

2020-12-01 08:47:36

Java異常開(kāi)發(fā)

2020-06-12 15:50:56

options前端服務(wù)器

2021-09-09 07:21:26

TypeScript 高級(jí)類型

2021-09-16 07:52:18

算法應(yīng)用場(chǎng)景

2019-05-10 10:50:04

Spring AOPJDK動(dòng)態(tài)代理CGLIB動(dòng)態(tài)代理

2021-11-09 08:51:13

模式命令面試

2020-12-04 06:27:04

序列化面試官Java

2021-11-05 07:47:56

代理模式對(duì)象

2021-11-02 22:04:58

模式

2021-11-10 07:47:49

組合模式場(chǎng)景

2021-08-16 08:33:26

git

2021-11-03 14:10:28

工廠模式場(chǎng)景

2022-02-21 17:24:18

序列化對(duì)象存儲(chǔ)

2024-07-26 08:10:10

2025-01-13 09:24:32

2021-08-11 08:53:23

Git命令面試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)