自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

結(jié)構(gòu)與算法:二叉樹與多叉樹

開發(fā) 前端 算法
樹形結(jié)構(gòu)是一層次的嵌套結(jié)構(gòu)。一個(gè)樹形結(jié)構(gòu)的外層和內(nèi)層有相似的結(jié)構(gòu),所以這種結(jié)構(gòu)多可以遞歸的表示。經(jīng)典數(shù)據(jù)結(jié)構(gòu)中的各種樹狀圖是一種典型的樹形結(jié)構(gòu):一顆樹可以簡(jiǎn)單的表示為根, 左子樹, 右子樹。 左子樹和右子樹又有自己的子樹。

一、樹狀結(jié)構(gòu)

1、數(shù)組與鏈表

數(shù)組結(jié)構(gòu)

數(shù)組存儲(chǔ)是通過下標(biāo)方式訪問元素,查詢速度快,如果數(shù)組元素是有序的,還可使用二分查找提高檢索速度;如果添加新元素可能會(huì)導(dǎo)致多個(gè)下標(biāo)移動(dòng),效率較低;

鏈表結(jié)構(gòu)

鏈表存儲(chǔ)元素,對(duì)于元素添加和刪除效率高,但是遍歷元素每次都需要從頭結(jié)點(diǎn)開始,效率特別低;

樹形結(jié)構(gòu)能同時(shí)相對(duì)提高數(shù)據(jù)存儲(chǔ)和讀取的效率。

2、樹結(jié)構(gòu)概念

 

結(jié)構(gòu)與算法:二叉樹與多叉樹
  • 根節(jié)點(diǎn):樹的根源,沒有父節(jié)點(diǎn)的節(jié)點(diǎn),如上圖A節(jié)點(diǎn);
  • 兄弟節(jié)點(diǎn):擁有同一父節(jié)點(diǎn)的子節(jié)點(diǎn)。如圖B與C點(diǎn);
  • 葉子節(jié)點(diǎn):沒有子節(jié)點(diǎn)的節(jié)點(diǎn)。如圖DEFG節(jié)點(diǎn);
  • 樹的高度:最大層數(shù),如圖為3層;
  • 路徑:從root根節(jié)點(diǎn)找到指定節(jié)點(diǎn)的路線;

樹形結(jié)構(gòu)是一層次的嵌套結(jié)構(gòu)。一個(gè)樹形結(jié)構(gòu)的外層和內(nèi)層有相似的結(jié)構(gòu),所以這種結(jié)構(gòu)多可以遞歸的表示。經(jīng)典數(shù)據(jù)結(jié)構(gòu)中的各種樹狀圖是一種典型的樹形結(jié)構(gòu):一顆樹可以簡(jiǎn)單的表示為根, 左子樹, 右子樹。 左子樹和右子樹又有自己的子樹。

二、二叉樹模型

 

結(jié)構(gòu)與算法:二叉樹與多叉樹

樹的種類有很多,二叉樹(BinaryTree)是樹形結(jié)構(gòu)的一個(gè)重要類型,每個(gè)節(jié)點(diǎn)最多只能有兩個(gè)子節(jié)點(diǎn)的一種形式稱為二叉樹,二叉樹的子節(jié)點(diǎn)分為左節(jié)點(diǎn)和右節(jié)點(diǎn),許多實(shí)際問題抽象出來的數(shù)據(jù)結(jié)構(gòu)往往是二叉樹形式。

完全二叉樹

 

結(jié)構(gòu)與算法:二叉樹與多叉樹

二叉樹的所有葉子節(jié)點(diǎn)都在最后一層或者倒數(shù)第二層,而且最后一層的葉子節(jié)點(diǎn)在左邊連續(xù),倒數(shù)第二 層的葉子節(jié)點(diǎn)在右邊連續(xù),我們稱為完全二叉樹

滿二叉樹

 

結(jié)構(gòu)與算法:二叉樹與多叉樹

當(dāng)二叉樹的所有葉子節(jié)點(diǎn)都在最后一層,并且結(jié)點(diǎn)總數(shù)= 2^n -1 , n 為層數(shù),則稱為滿二叉樹。

平衡二叉樹

 

結(jié)構(gòu)與算法:二叉樹與多叉樹

平衡二叉樹指的是,任意節(jié)點(diǎn)的子樹的高度差的絕對(duì)值都小于等于1,并且左右兩個(gè)子樹都是一棵平衡二叉樹,常見的符合平衡樹的有,B樹(多路平衡搜索樹)、AVL樹(二叉平衡搜索樹)等。

二叉查找樹

 

結(jié)構(gòu)與算法:二叉樹與多叉樹

二叉查找樹(BinarySearchTree)不但二叉樹,同時(shí)滿足一定的有序性:節(jié)點(diǎn)的左子節(jié)點(diǎn)比自己小,節(jié)點(diǎn)的右子節(jié)點(diǎn)比自己大。

三、二叉樹編碼

1、基礎(chǔ)代碼

節(jié)點(diǎn)代碼

  1. class TreeNode { 
  2.     private String num ; 
  3.     private TreeNode leftNode ; 
  4.     private TreeNode rightNode ; 
  5.     public TreeNode(String num) { 
  6.         this.num = num; 
  7.     }    @Override 
  8.     public String toString() { 
  9.         return "TreeNode{num=" + num +'}'
  10.     }} 

樹結(jié)構(gòu)代碼

  1. class BinaryTree01 { 
  2.     private TreeNode root ; 

2、遍歷與查找

前序遍歷查找

先處理當(dāng)前結(jié)點(diǎn)的數(shù)據(jù),再依次遞歸遍歷左子樹和右子樹;

  1. public void prevTraverse() { 
  2.     // 輸出父結(jié)點(diǎn) 
  3.     System.out.println(this); 
  4.     // 向左子樹遞歸前序遍歷 
  5.     if(this.leftNode != null) { 
  6.         this.leftNode.prevTraverse(); 
  7.     }    // 向右子樹遞歸前序遍歷 
  8.     if(this.rightNode != null) { 
  9.         this.rightNode.prevTraverse(); 
  10.     }}public TreeNode prevSearch(String num) {    //比較當(dāng)前結(jié)點(diǎn) 
  11.     if(this.num.equals(num)) { 
  12.         return this ; 
  13.     }    // 遞歸遍歷左子樹查找 
  14.     TreeNode findNode = null
  15.     if(this.leftNode != null) { 
  16.         findNode = this.leftNode.prevSearch(num); 
  17.     }    // 左子樹遍歷命中 
  18.     if(findNode != null) { 
  19.         return findNode ; 
  20.     }    // 遞歸遍歷右子樹查找 
  21.     if(this.rightNode != null) { 
  22.         findNode = this.rightNode.prevSearch(num); 
  23.     }    return findNode ; 

中序遍歷查找

先遞歸遍歷左子樹,再處理父節(jié)點(diǎn),再遞歸遍歷右子樹

  1. public void midTraverse() { 
  2.     // 向左子樹遞歸中序遍歷 
  3.     if(this.leftNode != null) { 
  4.         this.leftNode.midTraverse(); 
  5.     }    // 輸出父結(jié)點(diǎn) 
  6.     System.out.println(this); 
  7.     // 向右子樹遞歸中序遍歷 
  8.     if(this.rightNode != null) { 
  9.         this.rightNode.midTraverse(); 
  10.     }}public TreeNode midSearch(String num) {    // 遞歸遍歷左子樹查找 
  11.     TreeNode findNode = null
  12.     if(this.leftNode != null) { 
  13.         findNode = this.leftNode.midSearch(num); 
  14.     }    if(findNode != null) { 
  15.         return findNode ; 
  16.     }    // 比較當(dāng)前結(jié)點(diǎn) 
  17.     if(this.num.equals(num)) { 
  18.         return this ; 
  19.     }    // 遞歸遍歷右子樹查找 
  20.     if(this.rightNode != null) { 
  21.         findNode = this.rightNode.midSearch(num); 
  22.     }    return findNode ; 

后序遍歷查找

先遞歸遍歷左子樹,再遞歸遍歷右子樹,最后處理父節(jié)點(diǎn);

  1. public void lastTraverse() { 
  2.     // 向左子樹遞歸后序遍歷 
  3.     if(this.leftNode != null) { 
  4.         this.leftNode.lastTraverse(); 
  5.     }    // 向右子樹遞歸后序遍歷 
  6.     if(this.rightNode != null) { 
  7.         this.rightNode.lastTraverse(); 
  8.     }    // 輸出父結(jié)點(diǎn) 
  9.     System.out.println(this); 
  10. }public TreeNode lastSearch(String num) {    // 遞歸遍歷左子樹查找 
  11.     TreeNode findNode = null
  12.     if(this.leftNode != null) { 
  13.         findNode = this.leftNode.lastSearch(num); 
  14.     }    if(findNode != null) { 
  15.         return findNode ; 
  16.     }    // 遞歸遍歷右子樹查找 
  17.     if(this.rightNode != null) { 
  18.         findNode = this.rightNode.lastSearch(num); 
  19.     }    if(findNode != null) { 
  20.         return findNode ; 
  21.     }    // 比較當(dāng)前結(jié)點(diǎn) 
  22.     if(this.num.equals(num)) { 
  23.         return this ; 
  24.     }    return null ; 

3、刪除節(jié)點(diǎn)

如果當(dāng)前刪除的節(jié)點(diǎn)是葉子節(jié)點(diǎn),則可以直接刪除該節(jié)點(diǎn);如果刪除的節(jié)點(diǎn)是非葉子節(jié)點(diǎn),則刪除該節(jié)點(diǎn)樹。

  1. public void deleteNode(String num) { 
  2.     // 判斷左節(jié)點(diǎn)是否刪除 
  3.     if(this.leftNode != null && this.leftNode.num.equals(num)) { 
  4.         this.leftNode = null ; 
  5.         return ; 
  6.     }    // 判斷右節(jié)點(diǎn)是否刪除 
  7.     if(this.rightNode != null && this.rightNode.num.equals(num)) { 
  8.         this.rightNode = null
  9.         return ; 
  10.     }    // 向左子樹遍歷進(jìn)行遞歸刪除 
  11.     if(this.leftNode != null) { 
  12.         this.leftNode.deleteNode(num); 
  13.     }    // 向右子樹遍歷進(jìn)行遞歸刪除 
  14.     if(this.rightNode != null) { 
  15.         this.rightNode.deleteNode(num); 
  16.     }} 

四、多叉樹

 

結(jié)構(gòu)與算法:二叉樹與多叉樹

多叉樹是指一個(gè)父節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn),但是一個(gè)子節(jié)點(diǎn)依舊遵循一個(gè)父節(jié)點(diǎn)定律,通常情況下,二叉樹的實(shí)際應(yīng)用高度太高,可以通過多叉樹來簡(jiǎn)化對(duì)數(shù)據(jù)關(guān)系的描述。

例如:Linux文件系統(tǒng),組織架構(gòu)關(guān)系,角色菜單權(quán)限管理系統(tǒng)等,通常都基于多叉樹來描述。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2020-11-02 09:15:47

算法與數(shù)據(jù)結(jié)構(gòu)

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-09-29 10:19:00

算法平衡二叉樹

2013-07-15 16:35:55

二叉樹迭代器

2021-03-19 10:25:12

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-01 10:34:18

Java編程數(shù)據(jù)結(jié)構(gòu)算法

2021-04-19 07:47:42

數(shù)據(jù)結(jié)構(gòu)二叉樹Tree

2021-04-20 08:37:14

數(shù)據(jù)結(jié)構(gòu)二叉樹

2021-04-28 20:12:27

數(shù)據(jù)結(jié)構(gòu)創(chuàng)建

2021-03-22 09:00:22

Java數(shù)據(jù)結(jié)構(gòu)算法

2018-03-15 08:31:57

二叉樹存儲(chǔ)結(jié)構(gòu)

2021-09-15 07:56:32

二叉樹層次遍歷

2022-12-26 00:51:33

雙向鏈表二叉搜索樹

2021-03-17 08:19:22

二叉樹LeetCode

2009-05-27 09:38:32

C#二叉樹

2024-01-23 12:54:00

C++編程語言代碼

2020-12-22 08:56:51

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2009-08-11 13:29:57

C#二叉樹遍歷

2020-12-30 08:35:34

貪心算法監(jiān)控

2021-09-28 06:28:51

二叉樹公共祖先
點(diǎn)贊
收藏

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