国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

二叉樹(Binary Tree)

二叉樹(Binary Tree)是一種樹形數(shù)據(jù)結(jié)構(gòu),由節(jié)點構(gòu)成,每個節(jié)點最多有兩個子節(jié)點:一個左子節(jié)點和一個右子節(jié)點。

	public class TreeNode {
      	 int val;
      	 TreeNode left;
      	 TreeNode right;
      	 TreeNode(int val) { this.val = val; }
    }

基本概念

"二叉樹"(Binary Tree)這個名稱的由來是因為二叉樹的每個節(jié)點最多有兩個子節(jié)點,一個左子節(jié)點和一個右子節(jié)點。其中,“二叉”指的是兩個,因此“二叉樹”表示每個節(jié)點最多可以分支成兩個子節(jié)點?;径x:

  • 每個節(jié)點包含一個值(或數(shù)據(jù)),另外最多有兩個子節(jié)點。
  • 左子節(jié)點和右子節(jié)點的順序是固定的,左邊的子節(jié)點是左子節(jié)點,右邊的子節(jié)點是右子節(jié)點。
  • 一個節(jié)點可以沒有子節(jié)點(葉節(jié)點),也可以有一個子節(jié)點或兩個子節(jié)點(內(nèi)部節(jié)點)。

數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)

相關(guān)基本概念:

  • 根節(jié)點(Root): 二叉樹的頂部節(jié)點稱為根節(jié)點,是樹的起始點。
  • 節(jié)點(Node): 二叉樹的基本構(gòu)建單元。每個節(jié)點包含一個值(或數(shù)據(jù))以及指向左子節(jié)點和右子節(jié)點的指針。
  • 父節(jié)點(Parent Node): 一個節(jié)點的直接上級節(jié)點,如果存在的話。例如,一個節(jié)點的左子節(jié)點的父節(jié)點是該節(jié)點本身。
  • 葉節(jié)點(Leaf Node): 沒有子節(jié)點的節(jié)點稱為葉節(jié)點,即左子節(jié)點和右子節(jié)點都為空。
  • 子樹(Subtree): 以某個節(jié)點為根的樹,它包括該節(jié)點及其所有后代節(jié)點。
  • 高度(Height): 從某個節(jié)點到其最遠葉節(jié)點的最長路徑上的邊數(shù),也稱為節(jié)點的層數(shù)。葉節(jié)點的高度為0。

在二叉樹基本定義上,加上一些規(guī)則,可以衍生出更多種類的二叉樹。比如:

二叉搜索樹(Binary Search Tree,BST): 一種特殊的二叉樹,滿足以下性質(zhì):對于樹中的每個節(jié)點,其左子樹中的值都小于該節(jié)點的值,而其右子樹中的值都大于該節(jié)點的值。BST通常用于實現(xiàn)有序數(shù)據(jù)集合。

完全二叉樹(Complete Binary Tree): 一個二叉樹,其所有層次(深度)除了最后一層外,都是完全填充的,且最后一層的節(jié)點從左到右填充,沒有空隙。

平衡二叉樹(Balanced Binary Tree): 一種高度平衡的二叉樹,其中每個節(jié)點的兩棵子樹的高度差不超過1。平衡二叉樹通常用于提高查找、插入和刪除操作的性能。

預(yù)備基礎(chǔ)算法 —— 遞歸(Recursion)

下一部分要寫的是二叉樹基本遍歷代碼實現(xiàn)其實可以有多種,思量后用遞歸實現(xiàn)應(yīng)該是初接觸者比較簡潔好理解的方式。為此,在寫二叉樹下一部分內(nèi)容之前簡單寫下基礎(chǔ)遞歸算法,以保證本系列文章承前啟后。

遞歸(Recursion),在數(shù)學(xué)與計算機科學(xué)中對其描述的說法有很多,比如:

  1. 指在函數(shù)的定義中使用函數(shù)自身的方法;
  2. 指一種通過重復(fù)將問題分解為同類的子問題而解決問題的方法;
    (PS:這里同類子問題對于于上一種說法就是函數(shù)自身)
  3. 指由一種(或多種)簡單的基本情況定義的一類對象或方法,并規(guī)定其他所有情況都能被還原為其基本情況。
    (PS:這里描述的基本情況對應(yīng)于第一種說法中的函數(shù)自身了)

當(dāng)然本文非學(xué)術(shù)著作"哪種描述比較合適"在此不多做分析,從編碼實踐的角度第一種說法更為地氣一點。

“將問題分解為同類的子問題” 這一點是用遞歸的方式來解題的關(guān)鍵,這里用個簡單的累加和的例子:

設(shè)計一個函數(shù),輸入?yún)?shù)為 n ,返回 1+2+...n 的和。

public int sum(int n){
	int result = 0;
	for (int i = 1; i <= n ; i++) {
		result = result + i; 
	}
	return result;
}

想想初學(xué) C 語言for循環(huán)的時候應(yīng)該都有寫過上述代碼,從 1開始遞增加到 n 這其實是典型的遞推。那如果用遞歸的思路來思考的話:

求 1+2+..n 的和(問題) -> 就是 n 加上 求 1+2+..(n-1) 的和(同類的子問題);
其中最基本的情況 1 的和 為 1。

public int sum( int n ) {
	if( 1 == n) return 1;
	return n + sum(n-1);
}

可以看到遞歸的代碼實現(xiàn)上是不是非常簡潔。大部分初學(xué)者思考上比較習(xí)慣于遞推,如果第一次接觸遞歸角度思考會有些不適應(yīng)(或者無法獨立分析出來遞歸)也是正常。當(dāng)慢慢熟悉后,會發(fā)現(xiàn)用遞歸的思路解決某些算法問題往往會非常簡單(在本篇接下來的內(nèi)容中就能發(fā)現(xiàn)這點)。

在 初學(xué)遞歸 過度到 熟悉遞歸 這個階段,筆者建議可以考慮把一些用遞推已經(jīng)解決了的問題 用 遞歸的思路嘗試解決,習(xí)慣遞歸思路后會打開一片新世界。

基本遍歷(Traversal)

二叉樹的遍歷是指按照一定的順序訪問二叉樹的所有節(jié)點。在二叉樹中,有三種常見的遍歷方式,它們分別是前序遍歷、中序遍歷和后序遍歷。

先序遍歷(Preorder Traversal)

從根節(jié)點開始,首先訪問根節(jié)點,然后按照前序遍歷的方式依次訪問左子樹和右子樹。前序遍歷通常用于復(fù)制一棵樹或計算表達式的值。

訪問順序:根節(jié)點 -> 左子樹 -> 右子樹

Leetcode 144. 二叉樹的前序遍歷【簡單】

給你二叉樹的根節(jié)點 root ,返回它節(jié)點值的 前序 遍歷。

數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)

中序遍歷(Inorder Traversal)

從根節(jié)點開始,首先按照中序遍歷的方式訪問左子樹,然后訪問根節(jié)點,最后訪問右子樹。中序遍歷通常用于訪問二叉搜索樹中的節(jié)點,以升序或降序訪問節(jié)點值。

訪問順序:左子樹 -> 根節(jié)點 -> 右子樹

Leetcode 94. 二叉樹的中遍歷【簡單】

給定一個二叉樹的根節(jié)點 root ,返回 它的 中序 遍歷 。

數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)

針對后序遍歷(Postorder Traversal)從根節(jié)點開始,首先按照后序遍歷的方式訪問左子樹,然后訪問右子樹,最后訪問根節(jié)點。后序遍歷通常用于釋放二叉樹的內(nèi)存,或計算表達式的值。訪問順序:左子樹 -> 右子樹 -> 根節(jié)點,在此不過多描述相信一定能夠完成編碼。

反向構(gòu)建

Leetcode 105. 從前序與中序遍歷序列構(gòu)造二叉樹【中等】

給定兩個整數(shù)數(shù)組 preorder 和 inorder ,其中 preorder 是二叉樹的先序遍歷, inorder 是同一棵樹的中序遍歷,請構(gòu)造二叉樹并返回其根節(jié)點。

數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)

綜合應(yīng)用

本系列文章中已經(jīng)介紹了鏈表、遞歸、二叉樹,解決算法問題往往會需要綜合應(yīng)用。不妨來看下下面這個問題:

Leetcode 114. 二叉樹展開為鏈表【中等】

給你二叉樹的根結(jié)點 root ,請你將它展開為一個單鏈表:
展開后的單鏈表應(yīng)該同樣使用 TreeNode ,其中 right 子指針指向鏈表中下一個結(jié)點,而左子指針始終為 null 。
展開后的單鏈表應(yīng)該與二叉樹 先序遍歷 順序相同。

數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)
數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)文章來源地址http://www.zghlxwxcb.cn/news/detail-711484.html

總結(jié)下

  • 介紹了二叉樹的的一些基本概念包括:根節(jié)點、葉子節(jié)點、高度等等;
  • 介紹了基礎(chǔ)算法遞歸的思想:“重復(fù)將問題分解為同類的子問題而解決問題的方法”;
  • 介紹了基本的二叉樹遍歷 和 反向構(gòu)建的相關(guān)思路;
  • 結(jié)合本系列先前文章內(nèi)容,解決綜合鏈表、遞歸、二叉樹的問題,靈活處理使用數(shù)據(jù)結(jié)構(gòu)的特征是關(guān)鍵。

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法 | 二叉樹(Binary Tree)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)英文習(xí)題解析-第五章 二叉搜索樹Binary Search Tree

    數(shù)據(jù)結(jié)構(gòu)英文習(xí)題解析-第五章 二叉搜索樹Binary Search Tree

    前言:最近快到FDS考試了,po重刷了一下學(xué)校的題目,自己整理了一些解析orz 因為po在自己找解析和學(xué)習(xí)的過程中非常痛苦,所以在此共享一下我的題目和自己寫的解題思路,歡迎各位指出錯誤~全章節(jié)預(yù)計會陸續(xù)更新,可在專欄查看~ HW5 1.In a binary search tree, the keys on the same

    2024年04月09日
    瀏覽(22)
  • 【算法】Distribute Coins in Binary Tree 在二叉樹中分配硬幣

    給定一個有 N 個結(jié)點的二叉樹的根結(jié)點 root,樹中的每個結(jié)點上都對應(yīng)有 node.val 枚硬幣,并且總共有 N 枚硬幣。 在一次移動中,我們可以選擇兩個相鄰的結(jié)點,然后將一枚硬幣從其中一個結(jié)點移動到另一個結(jié)點。(移動可以是從父結(jié)點到子結(jié)點,或者從子結(jié)點移動到父結(jié)點。

    2024年02月16日
    瀏覽(21)
  • 二叉樹(binary tree)

    二叉樹(binary tree)

    二叉樹(Binary Tree)是一種常見的樹狀數(shù)據(jù)結(jié)構(gòu),它由一組節(jié)點組成,每個節(jié)點最多有兩個子節(jié)點,分別稱為左子節(jié)點和右子節(jié)點。二叉樹具有以下特點: 每個節(jié)點最多有兩個子節(jié)點,分別稱為左子節(jié)點和右子節(jié)點。 左子樹和右子樹也是二叉樹,它們的結(jié)構(gòu)與父節(jié)點類似。

    2024年02月09日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】--- 二叉樹(3)--二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實現(xiàn)(1)

    【數(shù)據(jù)結(jié)構(gòu)和算法】--- 二叉樹(3)--二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實現(xiàn)(1)

    在學(xué)習(xí)二叉樹的基本操作前,需先要創(chuàng)建一棵二叉樹,然后才能學(xué)習(xí)其相關(guān)的基本操作。由于現(xiàn)在大家對二叉樹結(jié)構(gòu)掌握還不夠深入,且為了方便后面的介紹,此處手動快速創(chuàng)建一棵簡單的二叉樹,快速進入二叉樹操作學(xué)習(xí),等二叉樹結(jié)構(gòu)了解的差不多時,我們反過頭再來研

    2024年01月25日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】—— 二叉樹

    【數(shù)據(jù)結(jié)構(gòu)與算法】—— 二叉樹

    目錄 一、樹 1、初識樹 2、樹的一些概念 3、樹的表示形式 二、二叉樹 1、初識二叉樹 2、兩種特殊的二叉樹 3、二叉樹的性質(zhì)? 4、二叉樹的遍歷 5、實現(xiàn)一棵二叉樹? 6、二叉樹題目(沒代碼的后面會給補上) (1)根節(jié)點沒有前驅(qū)。 (2)子樹的根節(jié)點只有一個前驅(qū),可以有

    2024年04月09日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)與算法-二叉樹

    ????????在計算機科學(xué)中,數(shù)據(jù)結(jié)構(gòu)是組織和存儲數(shù)據(jù)的基礎(chǔ)框架,而算法則是處理這些數(shù)據(jù)的核心邏輯。在這眾多的數(shù)據(jù)結(jié)構(gòu)中,二叉樹因其獨特的層級結(jié)構(gòu)、高效的搜索和插入操作,成為廣泛應(yīng)用的一種非線性數(shù)據(jù)結(jié)構(gòu)。本文將深入探討二叉樹的定義、種類、操作方法

    2024年03月10日
    瀏覽(43)
  • 二叉樹(上)——“數(shù)據(jù)結(jié)構(gòu)與算法”

    二叉樹(上)——“數(shù)據(jù)結(jié)構(gòu)與算法”

    各位CSDN的uu們好呀,好久沒有更新我的數(shù)據(jù)結(jié)構(gòu)與算法專欄啦,今天,小雅蘭繼續(xù)來更新二叉樹的內(nèi)容,下面,讓我們進入鏈?zhǔn)蕉鏄涞氖澜绨桑。。?二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實現(xiàn)? 二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實現(xiàn) 普通的二叉樹的增刪查改是沒有價值的?。?! 只有搜索二叉樹的增刪查改才

    2024年02月15日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復(fù)制二叉樹(算法CopyTree)

    【數(shù)據(jù)結(jié)構(gòu)】樹與二叉樹(十三):遞歸復(fù)制二叉樹(算法CopyTree)

    ??二叉樹是一種常見的樹狀數(shù)據(jù)結(jié)構(gòu),它由結(jié)點的有限集合組成。一個二叉樹要么是 空集 ,被稱為 空二叉樹 ,要么由一個根結(jié)點和兩棵不相交的子樹組成,分別稱為 左子樹 和 右子樹 。每個結(jié)點最多有兩個子結(jié)點,分別稱為左子結(jié)點和右子結(jié)點。 引理5.1:二叉樹中層數(shù)

    2024年02月01日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)與算法——樹與二叉樹

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

    ??各位小伙伴久等了,本專欄新文章出爐了!?。?我又回來啦,接下來的時間里,我會持續(xù)把數(shù)據(jù)結(jié)構(gòu)與算法專欄更新完。 ??樹型結(jié)構(gòu)?? 是一類重要的 ?非線性數(shù)據(jù)結(jié)構(gòu) ,其中以樹和二叉樹最為常用,直觀來看,樹是以分支關(guān)系定義的層次結(jié)構(gòu)。樹型結(jié)構(gòu)在客觀世界中

    2024年02月11日
    瀏覽(16)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】樹與二叉樹

    【數(shù)據(jù)結(jié)構(gòu)與算法】樹與二叉樹

    除了之前我們講的棧、隊列、鏈表等線性結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)中還有著一對多的 非線性結(jié)構(gòu) ——— 樹 。 樹是有 n 個結(jié)點組成的有限集,當(dāng)n=0時為空樹,在任意一顆非空樹中,有且僅有一個 特定的根結(jié)點 ;當(dāng)n1時,其余結(jié)點又可以分為一棵樹,稱為根的 子樹 。 如下圖所示: A為

    2023年04月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包