Java二叉樹(1)

🐵本篇文章將對二叉樹的相關概念、性質和遍歷等知識進行講解


? 一、什么是樹

在講二叉樹之前,先了解一下什么是樹:樹是一種非線性結構,其由許多節點和子節點組成,整體形狀如一顆倒掛的樹,比如下圖:

A就是這棵樹的根,BDEF、D、CG、G等都可以看作這顆樹的一顆子樹,在樹形結構中子樹之間不能由交集,否則不能稱為樹,如下圖就不是樹:

二、樹的相關概念

1. 結點的度:一個結點含有子結點的個數稱為該結點的度,如A的度為2,B的度3,D的度為0

2. 樹的度:所有結點度的最大值稱為樹的度,比如上樹中B的度最大,則該樹的度為3

3. 葉子結點/終端結點:度為0的結點稱為葉子結點,如上樹中的D E F G

4. 雙親結點/父結點:一個結點的前驅結點稱為該結點的父結點,如B的父結點為A

5. 孩子結點/子結點:一個結點的后繼結點稱為該結點的子結點,如B的子結點有D E F

6. 根結點:沒有雙親結點的結點稱為根結點,上樹的根結點為A

7. 結點的層次:從根結點那一層開始定義,A為第一層(有時是從0開始),B C所處第二層,依此類推

8. 樹的高度:樹中結點的最大層次為稱為該樹的高度,上樹的高度為3

三、二叉樹

二叉樹是一種特殊的樹,一棵所有結點的度都小于等于2的樹稱為二叉樹

二叉樹特別講究順序,如上圖中如果G為C的左孩子,則又是一顆完全不同的二叉樹

3.1 滿二叉樹

從根結點開始,從上到下從左到右每一層都放滿了結點的樹稱為滿二叉樹,如下圖:

若一個滿二叉樹有k層,則其每一層有2^(k - 1)個結點,整個樹共有(2^k) - 1個結點

3.2 完全二叉樹

從根結點開始,從上到下從左到右依次存放結點,最后一層可以不滿,這樣的二叉樹稱為完全二叉樹,如下圖:

下圖不是完全二叉樹:

3.3?二叉樹的性質

1. 若規定根結點的層數為1,則一棵非空二叉樹的第i層上最多有2^(i - 1)個結點

2. 若規定根結點的層數為1,則一棵非空二叉樹的最大結點數是(2^i) - 1

3. 對任何一棵二叉樹,如果其葉結點個數為n0,度為2的結點個數為n2,則有n0=n2+1

4. 具有n個結點的完全二叉樹高度為:log?(n + 1)向上取整,如:3.x為4;或者log?(n) + 1向下取整,如3.x為3

5. 具有n個結點的完全二叉樹,從上到下從左到右依次編號,規定根結點的編號為0,則編號為i的結點:雙親編號:(i - 1) / 2;左孩子編號:2i + 1,若2i + 1 > n則無左孩子;右孩子編號:2i + 2,若2i + 2?> n則無右孩子

下面講一道例題:

一個具有767個節點的完全二叉樹,其葉子節點個數為()
A 383
B 384
C 385
D 386

【解析】由于二叉樹中的結點的度都不大于2,所以設度為0,1,2的結點的個數分別為n0,n1,n2,則n0 + n1 + n2 = 767,由性質3:n0 = n2 + 1得2*n0 + n1 = 768,在完全二叉樹中,度為1的結點只可能有1個或0個,如果n1 = 1,則n0不是一個整數,所以n1只可能為0,經計算n0 = 384

3.4 二叉樹的存儲

二叉樹有兩種存儲方式,分別為鏈式存儲和順序存儲,這里主要講解鏈式存儲,接下來用代碼以窮舉的方式先構造下面這個二叉樹

public class BinaryTree {static class TreeNode{public char val; public TreeNode left; //指向該結點的左孩子public TreeNode right; //指向該結點的右孩子public TreeNode(char val) {this.val = val;}}
}

接下來以窮舉的方式構造二叉樹

    public TreeNode creatTree() {TreeNode A = new TreeNode('A');TreeNode B = new TreeNode('B');TreeNode C = new TreeNode('C');TreeNode D = new TreeNode('D');TreeNode E = new TreeNode('E');TreeNode F = new TreeNode('F');TreeNode G = new TreeNode('G');TreeNode H = new TreeNode('H');A.left = B;A.right = C;B.left = D;B.right = E;E.right = H;C.left = F;C.right = G;return A; //返回這個樹的根結點}

3.5 二叉樹的遍歷

二叉樹共有3種遍歷方式,分別為:先序遍歷、中序遍歷、后序遍歷,接下來會逐個講解?

3.5.1 先序遍歷

先序遍歷一個樹,按照根、左子樹、右子樹的順序遍歷這個樹,直接看例子:

先遍歷這個樹的根A,之后遍歷A的左B,由于B又是一個子樹的根,所以要繼續遍歷B的左,B的左為空,那就遍歷B的右:F,F是一個子樹的根,所以要繼續遍歷F的左:D,D的左右都為空,那么F的左子樹全部遍歷完畢,接著遍歷F的右,F的右為空,那么B的右全部遍歷完畢,那接著就是A的左全部遍歷完畢,之后遍歷A的右:C,C又是一個子樹的根,所以要繼續遍歷C的左,C的左為空,那就遍歷C的右:G,G的左右都為空,至此A的右也全部遍歷完畢,那么整個二叉樹遍歷完畢整個遍歷的序列為:A B F D C G

3.5.2 中序遍歷

先序遍歷一個樹,按照左子樹、根、右子樹的順序遍歷這個樹,直接看例子:

先遍歷A的左,由于A的左也是一個子樹,所以要遍歷這個子樹的左:空,這個子樹的左遍歷完就要遍歷這個樹的根:B,之后遍歷這個子樹的右:F D,這也是一個子樹,所以要先遍歷這個子樹左:D,然后遍歷根:F,最后是右,右為空,那么整個二叉樹的左遍歷完畢,接著遍歷根:A,然后遍歷右子樹:C G,先遍歷這個樹的左,左為空,然后遍歷根:C,最后是右:G,至此整個二叉樹遍歷完畢,整個遍歷的序列為:B D F A C G

3.5.3 后序遍歷

先序遍歷一個樹,按照左子樹、右子樹、根的順序遍歷這個樹,直接看例子:

先遍歷這個二叉樹的左子樹:B F?D,這也是一個樹,所以先遍歷這個樹的左,左為空,然后遍歷這個樹的右子樹:F D,這也是一個樹,所以要先遍歷這個樹的左:D,然后遍歷這個樹的右,右為空,最后是根:F,那么B F D這個子樹的右遍歷完畢,然后遍歷B F D這個樹的根:B,至此整個樹的左子樹遍歷完畢,然后遍歷這個樹的右子樹:C G,先遍歷這個樹的左,左為空,然后遍歷右:G,再遍歷根C,最后遍歷整個樹的根:A,整個樹遍歷完畢,整個遍歷的序列為:D F B G C A

3.6 代碼實現二叉樹的遍歷

二叉樹的三種遍歷需要用遞歸的思想實現

先序遍歷:

    public void preOrder(TreeNode root) {if (root == null) { //如果根為空則直接返回return;}System.out.print(root.val +" ");preOrder(root.left); //以根的左孩子為新的根繼續遍歷preOrder(root.right); //以根的右孩子為新的根繼續遍歷}

root為null后返回至上一個方法,遍歷D的右孩子,右孩子也為空,則以D為根的方法結束返回至上一個方法,遍歷B的右孩子

右子樹也是同樣的道理

中序遍歷:

    public void inOrder(TreeNode root) {if (root == null) {return;}preOrder(root.left);System.out.print(root.val +" ");preOrder(root.right);}

后序遍歷:

    public void postOrder(TreeNode root) {if (root == null) {return;}preOrder(root.left);preOrder(root.right);System.out.print(root.val +" ");}

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

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

相關文章

給nginx部署https及自簽名ssl證書

一、生成服務器root證書 openssl genrsa -out root.key 2048 openssl req -new -key root.key -out root.csr#Country Name (2 letter code) [XX]:---> CN#Country Name (2 letter code) [XX]:---> CN#State or Province Name (full name) []:---> Shanghai#Locality…

多層感知機 + 代碼實現 - 動手學深度學習v2 | 李沐動手學深度學習課程筆記

感知機 感知機≈二分類問題 感知機和其他問題的對比 訓練感知機 如果小于等于零,說明預測錯啦 ,其實就是同號為正,異號為負 舉個分類的例子 增加樣本,改變分類線 繼續分類 感知機的收斂定理 XOR問題 XOR問題其實就是第1、3象限數…

【踩坑】一條指令解決torch_scatter等安裝報錯安裝不上問題

轉載請注明出處:小鋒學長生活大爆炸[xfxuezhang.cn] 目錄 背景說明 (推薦方法)解決方法一:使用conda安裝。 解決方法二:指定pip的網站。 解決方法三:直接去下載whl文件。 (終極方法)解決方法四:配置MSVC 特殊情況…

Linux系統運維腳本:掃描主機上多個端?狀態

目 錄 一、要求 二、解決方案 (一)解決思路 (二)方案 三、腳本程序實現 (一)腳本代碼和解釋 1、腳本代碼 2、代碼解釋 (二)腳本驗證 1、腳本編輯 2、給予執…

構建 ESLint 內存泄露檢測插件入門:提升代碼質量與防范運行時風險

前言 本文目的是介紹如何創建開發一個自定義規則 ESLint 插件。利用其能力,檢測一些代碼中可能存在的內存泄露并及時進行提示,避免潛在的后期影響。 本文實現其中一部分功能–檢測事件監聽器的使用是否存在內存泄露為例來演示基本的 ESLint 自定義規則插件開發的過程。用以…

nginx筆記整理

目錄 一.Nginx基礎介紹 二.nginx安裝配置 三.Nginx配置文件 3.1nginx主配置文件(/etc/nginx/nginx.conf) 3.2默認的網站配置文件(/etc/nginx/conf.d/default.conf) 四.創建新的虛擬主機 五.Nginx日志 5.1nginx日志格式 5.2查看日志 5.3日志緩存(了解) 5.4日志輪轉(/…

COMPOSER安裝使用WIN下升級PHP-V

想用TP6使用phpspreadsheet但是說我PHP版本低,原來是PHP7.0 composer要求至少7.4 直接修改環境變量,把PHP目錄切換到7.4 composer升級比較簡單,在PHP目錄下CMD然后官網的命令執行下即可 下面就可以在TP根目錄下執行命令安裝PHPSPREADSHEET…

sdbusplus:為connection綁定bus

基于前面對于sdbusplus的使用,可以看出,使用sdbusplus時可以通過bus完成method的調用,也可以通過connection完成方法的調用,比如: auto b = bus::new_default_user(); b.new_method_call(...); boost::asio::io_context io; auto conn = make_shared<sdbusplus::asio…

SpringBoot的基本了解

SpringBoot能廣泛應用的原因 1:獨立運行 Spring Boot而且內嵌了各種servlet容器,Tomcat、Jetty等,現在不再需要打成war包部署到容器 中,Spring Boot只要打成一個可執行的jar包就能獨立運行,所有的依賴包都在一個jar包內。 2:簡化配置 spring-boot-starter-web啟動器自動…

Domain-Wall Memory Buffer for Low-Energy NoCs

目錄 Domain-Wall Memory Buffer for Low-Energy NoCs主要工作DWM&#xff1a; Domain-wall memory磁疇壁存儲器磁性納米線陣列設計 開銷分析實驗設計實驗結果分析 參考資料 Domain-Wall Memory Buffer for Low-Energy NoCs 主要工作 我們基于SRAM在NoC中使用的頭尾指針概念&a…

2024年【道路運輸企業主要負責人】考試報名及道路運輸企業主要負責人模擬考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 道路運輸企業主要負責人考試報名根據新道路運輸企業主要負責人考試大綱要求&#xff0c;安全生產模擬考試一點通將道路運輸企業主要負責人模擬考試試題進行匯編&#xff0c;組成一套道路運輸企業主要負責人全真模擬考…

字符串匹配——煩人的KMP

相信很多同學看到這篇文章的時候&#xff0c;已經被KMP拿捏了吧&#xff01;KMP算法說難&#xff0c;倒也不是很難&#xff0c;手算都會&#xff0c;說不難吧&#xff0c;短短幾行代碼愣是看不懂&#xff0c;輾轉反側&#xff0c;翻書查閱&#xff0c;視頻講解&#xff0c;最后…

MySQL性能提升之道:深入探討SQL與索引優化實戰技巧

MySQL性能優化&#xff1a; MySQL性能優化是一個涉及多個層面的過程&#xff0c;旨在提高數據庫的響應速度、處理能力和資源利用率。以下是一些關鍵的性能優化策略&#xff1a; 硬件優化&#xff1a; 升級硬件資源&#xff0c;如CPU、內存、SSD硬盤等&#xff0c;以提供更好的…

electron nsis 安裝包 window下任務欄無法正常固定與取消固定 Pin to taskbar

問題 win10系統下&#xff0c;程序任務欄在固定后取消固定&#xff0c;展示的程序內容異常。 排查 1.通過論壇查詢&#xff0c;應該是與app的api setAppUserModelId 相關 https://github.com/electron/electron/issues/3303 2.electron-builder腳本 electron-builder…

三、低代碼平臺-單據配置(單表增刪改查)

一、業務效果圖 主界面 二、配置過程簡介 配置流程&#xff1a;業務表設計 -》業務對象建立-》業務單據配置-》菜單配置。 a、業務表設計 b、業務對象建立 c、業務單據配置 功能路徑&#xff1a;低代碼開發平臺/業務開發配置/單據配置維護 d、菜單配置

linux-tar命令--exclude

命令如下&#xff1a;將workscript 壓縮成workscript_v2.tar.gz&#xff0c;不打包workscript_v2目錄下的logs下的所有文件。 tar -zcf workscript_v2.tar.gz workscript --excludeworkscript_v2/logs workscript_v2.tar.gz--壓縮的文件名&#xff0c;可自定義 workscript--…

GCN原理回顧論文導讀

Cora_dataset description Cora數據集是一個常用的學術文獻用網絡數據集&#xff0c;用于研究學術文獻分類和圖網絡分析等任務。 該數據集由機器學習領域的博士論文摘要組成&#xff0c;共計2708篇論文&#xff0c;涵蓋了7個不同的學科領域。每篇論文都有一個唯一的ID&#xf…

【Linux】linux內核模塊編譯makefile

1、編譯進內核的模塊 如果需要將foo.ko編譯進內核&#xff0c;需要在makefile中進行配置&#xff1a; obj-y foo.o2、編譯可加載的模塊 如果需要將foo.ko編譯成可加載模塊&#xff0c;需要在makefile中進行配置&#xff1a; obj-m foo.oobj-m表示編譯生成可加載模塊。相對…

jQuery詳細介紹

一、引言 在Web開發的歷史長河中&#xff0c;JavaScript一直扮演著至關重要的角色。然而&#xff0c;原生的JavaScript在某些方面存在不足&#xff0c;如瀏覽器兼容性、DOM操作繁瑣等。為了簡化這些問題&#xff0c;jQuery應運而生。jQuery是一個輕量級的、功能豐富的JavaScri…

李沐動手學習深度學習——3.5練習

減少batch_size&#xff08;如減少到1&#xff09;是否會影響讀取性能&#xff1f; 肯定會影響&#xff0c;計算機io性能而言&#xff0c;隨著batch_size增大&#xff0c;讀取越來越快&#xff0c;需要的時間越少。這里會涉及到計算機操作系統的知識點&#xff0c;內存與硬盤之…