算法與數據結構(五)--樹與二叉查找樹

符號表的增刪查操作,隨著元素個數N的增多,其耗時也是線性增多的,時間復雜度都是O(n),為了提高運算效率,我們學習樹這種數據結構。

目錄

一.樹的基本定義

二.樹的相關術語

三.二叉樹的基本定義

四.二叉樹的鏈表實現

1.二叉樹結點類:

結點類API設計

代碼實現

2.二叉樹API設計

3.二叉樹實現思想

五.二叉樹的基礎遍歷

前序遍歷

中序遍歷

后序遍歷

六.二叉樹的層序遍歷

七.二叉樹的最大深度問題

總結


一.樹的基本定義

樹是由n(n>=1)個有限結點組成一個具有層次關系的集合。把它叫做樹是因為它看起來像一顆倒掛的樹,也就是說它是根朝上,而葉朝下的。

?樹具有以下特點:
1.每個結點有零個或多個子結點;
2.沒有父結點的結點為根節點;
3.每一個非根結點只有一個父結點;
4.每個結點及其后代結點整體上可以看做是一棵樹,成為當前結點的父結點的一個子樹;

二.樹的相關術語

結點的度:
一個結點含有的子樹的個數稱為該結點的度
葉結點:
度為0的結點稱為葉結點,也可以叫做終端結點;
分支結點:
度不為0的結點稱為分支結點,也可以叫做非終端結點
結點的層次:
從根結點開始,根結點的層次為1,根的直接后繼層次為2,以此類推
結點的層序編號:
從樹中的結點,按照從上層到下層,同層從左到右的次序排成一個線性序列,把他們編成連續的自然數。
樹的度:
樹中所有結點的度的最大值
樹的高度(深度):
樹中結點的最大層次
森林:
m(m>=0)個互不相交的樹的集合,將一個非空樹的根結點刪去,樹就變成了一個森林;給森林增加一個統一的根結點,森林就變成了一棵樹。
image-20220130152540028

孩子結點:
一個結點的直接后繼結點稱為該結點的孩子結點
雙親結點(父節點):
一個結點的直接前驅稱為該結點的雙親結點
兄弟結點:
同一雙親結點的孩子結點間互稱兄弟結點

三.二叉樹的基本定義

二叉樹就是度不超過2的樹(每個結點最多有兩個子結點)
image-20220130152635746

滿二叉樹:
一個二叉樹,如果每一個層的結點樹都達到最大值,則這個二叉樹就是滿二叉樹。
image-20220130152727315

完全二叉樹:
葉節點只能出現在最下層和次下層,并且最下面一層的結點都集中在蓋層最左邊的若干位置的二叉樹。
image-20220130152742406

四.二叉樹的鏈表實現

1.二叉樹結點類:

按照面向對象的思想,我們設計一個結點類來描述結點這個事物。

結點類API設計:
image-20220130152830503

代碼實現:

public class Node <Key,Vaule>{//存儲鍵public Key key;//存儲值public Value vaule;//記錄左子結點public Node left;//記錄右子結點public Node right;public Node(Key key, Value value, Node left, Node right){this.key=key;this.vaule=value;this.left=left;this.right=right;}
}

2.二叉樹API設計:

其他補充api:
private Node min(Node x)? ? ? ? 找出指定樹x中,最小鍵所在的結點
private Node max(Node x)? ? ? ? 找出指定樹x中,最大鍵所在的結點

3.二叉樹實現思想

插入方法put實現思想:
1.如果當前樹中沒有任何一個結點,則直接把新結點當做根結點使用
2.如果當前樹不為空,則從根結點開始:
2.1 如果新結點的key小于當前結點的key,則繼續找當前結點的左子結點
2.2 如果新結點的key大于當前結點的key,則繼續找當前結點的右子結點
2.3 如果新結點等于當前結點的key,則樹中已經存在這樣的結點,替換該結點的value值即可。

查詢方法get實現思想:

從根節點開始:
1.如果要查詢的key小于當前結點的key,則繼續找當前結點的左子結點;
2.如果要查詢的key大于當前結點的key,則繼續找當前結點的右子結點;
3.如果要查詢的key等于當前結點的key,則樹中返回當前結點的value。

刪除方法delete實現思想:

1.找到被刪除結點
2.找到被刪除結點右子樹中的最小結點minNode
3.刪除右子樹中的最小結點
4.讓被刪除結點的左子樹稱為最小結點minNode的左子樹,讓被刪除結點的右子樹稱為最小結點minNode的右子樹
5.讓被刪除結點的父節點指向最小結點minNode

?

五.二叉樹的基礎遍歷

樹的結構和線性表結構不一樣,沒有辦法從頭開始依次向后遍歷,所以存在按照什么樣的搜索路徑進行遍歷的問題。

我們可以把二叉樹的遍歷分為以下三種(簡單說就是按什么時候訪問根節點進而分為前中后):
1.前序遍歷:先訪問根節點,然后訪問左子樹,最后訪問右子樹。
2.中序遍歷:先訪問左子樹,中間訪問根節點,最后訪問右子樹。
3.后序遍歷:先訪問左子樹,再訪問右子數,最后訪問根節點。

可以看到其實就是三種操作變換順序罷了。

前序遍歷

實現步驟:
1.把當前結點的key放入到隊列中;
2.找到當前結點的左子樹,如果不為空,遞歸遍歷左子樹;
3.找到當前結點的右子樹,如果不為空,遞歸遍歷右子樹。

相關題目鏈接:

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

中序遍歷

實現步驟:
1.找到當前結點的左子樹,如果不為空,遞歸遍歷左子樹;
2.把當前結點的key放入到隊列中;
3.找到當前結點的右子樹,如果不為空,遞歸遍歷右子樹。

相關題目鏈接:

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

后序遍歷

實現步驟:
1.找到當前結點的左子樹,如果不為空,遞歸遍歷左子樹;
2.把當前結點的key放入到隊列中;
3.找到當前結點的右子樹,如果不為空,遞歸遍歷右子樹。

相關題目鏈接:
力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

六.二叉樹的層序遍歷

所謂層序遍歷,就是從根節點(第一層開始),依次向下,獲取每一層所有節點的值,
有二叉樹如下:

那么層序遍歷的結果是:EBGADFHC。

實現步驟:
1.創建隊列,存儲每一層的結點;
2.使用循環從隊列中彈出一個結點;
2.1獲取當前結點的key;
2.2如果當前結點的左子結點不為空,則把左子結點放入到隊列中;
2.3如果當前結點的右子結點不為空,則把右子結點放入到隊列中。

題目鏈接:
力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

七.二叉樹的最大深度問題

需求:給定一顆樹,計算樹的最大深度(樹的根節點到最遠葉子結點的最長路徑上的結點數)。

實現步驟:
1.如果根結點為空,則最大深度為0;
2.計算左子樹的最大深度;
3.計算右子樹的最大深度;
4.當前樹的最大深度=左子樹的最大深度和右子樹的最大深度中的較大者+1

題目鏈接:
力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

總結

可以看到關于樹的很多操作都要用到遞歸。

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

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

相關文章

leetcode 279. 完全平方數

2023.8.18 與零錢兌換相似&#xff0c;本題屬于完全背包問題&#xff1a;完全平方數為物品&#xff0c;整數n為背包。 直接上代碼&#xff1a; class Solution { public:int numSquares(int n) {vector<int> dp(n1 , INT_MAX);dp[0] 0;for(int i1; i*i<n; i){for(in…

時序預測 | MATLAB實現WOA-CNN-BiGRU鯨魚算法優化卷積雙向門控循環單元時間序列預測

時序預測 | MATLAB實現WOA-CNN-BiGRU鯨魚算法優化卷積雙向門控循環單元時間序列預測 目錄 時序預測 | MATLAB實現WOA-CNN-BiGRU鯨魚算法優化卷積雙向門控循環單元時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 時序預測 | MATLAB實現WOA-CNN-BiGRU鯨…

干翻Dubbo系列第十二篇:Dubbo協議介紹

文章目錄 文章說明 一&#xff1a;Dubbo協議 1&#xff1a;Dubbo協議簡介 2&#xff1a;Dubbo協議優點 3&#xff1a;Dubbo協議幀的組成 (一)&#xff1a;幻數 (二)&#xff1a;2Way (三)&#xff1a;event (四)&#xff1a;Serilization ID (五)&#xff1a;status …

每日一題 142環形鏈表||(快慢指針)

題目 給定一個鏈表的頭節點 head &#xff0c;返回鏈表開始入環的第一個節點。 如果鏈表無環&#xff0c;則返回 null。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部…

深入理解【二叉樹】

&#x1f4d9;作者簡介&#xff1a; 清水加冰&#xff0c;目前大二在讀&#xff0c;正在學習C/C、Python、操作系統、數據庫等。 &#x1f4d8;相關專欄&#xff1a;C語言初階、C語言進階、C語言刷題訓練營、數據結構刷題訓練營、有感興趣的可以看一看。 歡迎點贊 &#x1f44d…

Java中的異常

認識異常 異常就是程序出現的問題&#xff1b; Integer.valueOf("aaaa"); 異常體系 因為寫代碼時經常會出現問題&#xff0c;Java的設計者們早就為我們寫好了很多個異常類&#xff0c;來描述不同場景下的問題。而有些類是有共性的所以就有了異常的繼承體系 Error&…

日志采集分析ELK

這里的 ELK其實對應三種不同組件 1.ElasticSearch&#xff1a;基于Java&#xff0c;一個開源的分布式搜索引擎。 2.LogStash&#xff1a;基于Java&#xff0c;開源的用于收集&#xff0c;分析和存儲日志的工具。&#xff08;它和Beats有重疊的功能&#xff0c;Beats出現之后&a…

OLED透明屏采購指南:如何選擇高質量產品?

著科技的不斷進步&#xff0c;OLED透明屏作為一種創新的顯示技術&#xff0c;在各個行業中得到了廣泛應用。 在進行OLED透明屏采購時&#xff0c;選擇高質量的產品至關重要。在這篇文章中&#xff0c;尼伽將為您提供一個全面的OLED透明屏采購指南&#xff0c;幫助您了解關鍵步…

day20 飛機大戰射擊游戲

有飛行物類 飛行 爆炸 的連環畫&#xff0c; 飛行的背景圖 &#xff0c; 子彈圖&#xff0c; 還有游戲開始 暫停 結束 的畫面圖。 設計一個飛機大戰的小游戲&#xff0c; 玩家用鼠標操作hero飛行機&#xff0c; 射出子彈殺死敵機&#xff0c;小蜜蜂。 敵機可以獲得分數&…

Jmeter參數化類型

1.參數在多個請求報文中出現&#xff0c;執行一次需要使用同一個參數--隨機生成(隨機變更) 2.參數在請求報文中出現&#xff0c;執行過程需要使用同一個參數(--固定參數) 3.參數從指定幾個固定中隨機獲取一個 4.參數從本地文件中獲取 5.參數在多個請求報文中出現&#xff0c;每…

c++11:std::partition分割,std::is_partitioned判斷

序列 vec.clear();for(int i 0;i<10;i){vec.push_back(i);}重新分割。大于1的排在后&#xff0c;返回第一個 std::vector<int>::iterator it std::partition(vec.begin(),vec.end(),[](int value){return value>1;}); std::cout<<"partition:"&l…

計算機 數進制轉換;存儲MB與帶寬Mbps

參考&#xff1a;https://zhuanlan.zhihu.com/p/459817484 1、計算機 數進制轉換 1&#xff09;與十進制相關的轉換 2&#xff09;與二進制相關的轉換 二進制是Binary&#xff0c;簡寫為B&#xff1b;八進制是Octal&#xff0c;簡寫為O&#xff1b;十進制是Decimal&#xff…

centos nginx配置ipv4和ipv6的地址都可以訪問同一個網站

標題centos nginx配置ipv4和ipv6的地址都可以訪問同一個網站 在 Nginx 中配置使 IPv4 和 IPv6 地址都可以訪問同一個網站相對簡單。只需要確保 Nginx 配置文件正確地配置了監聽 IPv4 和 IPv6 地址的監聽器即可。 打開你的 Nginx 配置文件&#xff0c;通常位于 /etc/nginx/nginx…

還在玩傳統終端,不妨來試試全新 AI 終端 Warp

壹 ? 引 最近一段時間&#xff0c;AI領域如同雨后春筍般開始猛烈生長&#xff0c;processon&#xff0c;sentry&#xff0c;一些日常使用的工具都在積極接入AI&#xff0c;那么正好借著AI的風頭&#xff0c;今天給大家推薦一款非常不錯的智能終端 warp&#xff08;目前僅限ma…

車載APP軟件外包開發通訊

車載APP與車輛之間的通信方式和特點會因為不同的技術和場景而有所不同。以下是一些常見的車載APP與車輛通信方式以及它們的特點&#xff0c;希望對大家有所幫助。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作。 1.藍牙連接&#xff1a…

英語——基本句型

第一節 句型1——主語+謂語 一個句子為了說明一件事或表達一種感情,最簡單的表達方式,就是“誰,怎么了”。這里的“誰”,就是句子的主語,它的內涵很豐富,可以是人、物、某種行為等。“怎么了”,就是句子的謂語,一般由不及物動詞充當。主語+謂語,即構成一個最簡單的句…

STM32 F103C8T6學習筆記9:0.96寸單色OLED顯示屏—自由取模顯示—顯示漢字與圖片

今日學習0.96寸單色OLED顯示屏的自由取模顯示: 宋體漢字比較復雜&#xff0c;常用字符可以直接復制存下來&#xff0c;畢竟只有那么幾十個字母字符&#xff0c;但漢字實在太多了&#xff0c;基本不會全部放在單片機里存著&#xff0c;一般用到多少個字就取幾個字的模&#xff…

基于STM32+微信小程序設計的寵物投喂裝置(騰訊云IOT)

一、設計需求 【1】 項目背景 社會經濟的飛速發展與城市化進程的加速,城市市民家庭的封閉化和人口老齡化的情況日益突出,基于人們的情感寄托與休閑消費的需要,中國的寵物產業也悄然興起。家庭寵物的飼養成為了城市居民生活消遣的新方式。寵物的喂養和看護往往是寵物主人最…

hive高頻使用的拼接函數及“避坑”

hive高頻使用的拼接函數及“避坑” 說到拼接函數應用場景和使用頻次還是非常高&#xff0c;比如一個員工在公司充當多個角色&#xff0c;我們在底層存數的時候往往是多行&#xff0c;但是應用的時候我們通常會只需要一行&#xff0c;角色字段進行拼接&#xff0c;這樣join其他…

typescript基礎之null和undefined

TypeScript是一種基于JavaScript的編程語言&#xff0c;它支持靜態類型檢查和面向對象的特性。TypeScript中的null和undefined是兩種基本類型&#xff0c;它們分別表示空值或未定義的值。在本文中&#xff0c;我將介紹TypeScript中null和undefined的含義、區別、檢查方法和使用…