樹--搜索二叉樹

現有一棵結點數目為n的二叉樹,采用二叉鏈表的形式存儲。對于每個結點均有指向左右孩子的兩個指針域,而結點為n的二叉樹一共有n-1條有效分支路徑。那么,則二叉鏈表中存在2n-(n-1)=n+1個空指針域。那么,這些空指針造成了空間浪費。

例如:圖2.1所示一棵二叉樹一共有10個結點,空指針^有11個。

此外,當對二叉樹進行中序遍歷時可以得到二叉樹的中序序列。例如:圖2.1所示二叉樹的中序遍歷結果為HDIBJEAFCG,可以得知A的前驅結點為E,后繼結點為F。但是,這種關系的獲得是建立在完成遍歷后得到的,那么可不可以在建立二叉樹時就記錄下前驅后繼的關系呢,那么在后續尋找前驅結點和后繼結點時將大大提升效率。

線索化

現將某結點的空指針域指向該結點的前驅后繼,定義規則如下:

若結點的左子樹為空,則該結點的左孩子指針指向其前驅結點。

若結點的右子樹為空,則該結點的右孩子指針指向其后繼結點。

這種指向前驅和后繼的指針稱為線索。將一棵普通二叉樹以某種次序遍歷,并添加線索的過程稱為線索化。

按照規則將圖2.1所示二叉樹線索化后如圖所示:

圖中黑色點畫線為指向后繼的線索,紫色虛線為指向前驅的線索。

可以看出通過線索化,既解決了空間浪費問題,又解決了前驅后繼的記錄問題。

線索化帶來新問題

可以將一棵二叉樹線索化為一棵線索二叉樹,那么新的問題產生了。我們如何區分一個結點的lchild指針是指向左孩子還是前驅結點呢?例如:對于圖所示的結點E,如何區分其lchild的指向的結點J是其左孩子還是前驅結點呢?

為了解決這一問題,現需要添加標志位ltag,rtag。并定義規則如下:

ltag為0時,指向左孩子,為1時指向前驅

rtag為0時,指向右孩子,為1時指向后繼

添加ltag和rtag屬性后的結點結構如下:

上圖所示線索二叉樹轉變為圖所示的二叉樹。

答案:b

線索二叉樹結點數據結構

//#define Link 0//指針標志  
//#define Thread 1//線索標志  
typedef char TElemType;   
//中序線索二叉樹  
typedef enum PointerTag {Link, Thread};//結點的child域類型,link表示是指針,指向孩子結點,thread表示是線索,指示前驅或后繼結點  
//定義結點數據結構
typedef struct ThrBiNode{  TElemType data;  ThrBiNode *lchild, *rchild;//左右孩子指針  PointerTag lTag, rTag;//左右標志  
}ThrBiNode, *ThrBiTree;  

中序遍歷建立線索二叉樹

中序遍歷的方法已經在第一篇二叉基礎樹中講解過,那么實現線索化的過程就是在中序遍歷同時修改結點空指針的指向。

采用中序遍歷的訪問順序實現一棵二叉樹的線索化過程代碼如下:

//中序遍歷進行中序線索化
void inThreading(ThrBiTree T, ThrBiTree &pre){  if(T){  inThreading(T->lchild, pre);//左子樹線索化  if(!T->lchild){//當前結點的左孩子為空  T->lTag = Thread;  T->lchild = pre;  }else{  T->lTag = Link;  }  if(!pre->rchild){//前驅結點的右孩子為空  pre->rTag = Thread;  pre->rchild = T;  }else{  pre->rTag = Link;  }  pre = T;          inThreading(T->rchild, pre);//右子樹線索化  }  
}  

加上頭結點,遍歷線索二叉樹

加上線索的二叉樹結構是一個雙向鏈表結構,為了便于遍歷線索二叉樹,我們為其添加一個頭結點,頭結點左孩子指向原二叉樹的根結點,右孩子指針指向中序遍歷的最后一個結點。同時,將第一個結點左孩子指針指向頭結點,最后一個結點的右孩子指針指向頭結點。

上圖所示線索二叉樹添加頭結點后如圖所示:

帶有頭結點的線索二叉樹遍歷代碼如下:

//T指向頭結點,頭結點的lchild鏈域指針指向二叉樹的根結點  
//中序遍歷打印二叉線索樹T(非遞歸算法)  
void inOrderTraversePrint(ThrBiTree T){  ThrBiNode *p = T->lchild;//p指向根結點  while(p != T){//空樹或遍歷結束時,p == T  while(p->lTag == Link){  p = p->lchild;  }  //此時p指向中序遍歷序列的第一個結點(最左下的結點)  printf("%c ", p->data);//打印(訪問)其左子樹為空的結點  while(p->rTag == Thread && p->rchild != T){  p = p->rchild;  printf("%c ", p->data);//訪問后繼結點  }  //當p所指結點的rchild指向的是孩子結點而不是線索時,p的后繼應該是其右子樹的最左下的結點,即遍歷其右子樹時訪問的第一個節點  p = p->rchild;  }  printf("\n");  
}  

結語

線索二叉樹充分利用了指針空間,同時又便于尋找結點的前驅結點和后繼結點。線索二叉樹適用于經常需要遍歷尋找結點前驅或者后繼結點的二叉樹。

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

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

相關文章

【TB作品】msp430g2553單片機,秒表,LCD1602,Proteus仿真

功能 秒表 動圖&#xff1a; 部分代碼 這段代碼是用C語言編寫的&#xff0c;用于在基于德州儀器MSP430微控制器的平臺上實現一個簡易的電子秒表功能。 #include <msp430.h> #include "LCD.h"unsigned int second 0; unsigned int millisecond10…

【HarmonyOS】應用振動效果實現

一、問題背景&#xff1a; 應用在強提醒場景下&#xff0c;一般會有馬達振動的效果&#xff0c;提示用戶注意力的關注。 比如消息提醒&#xff0c;掃碼提示&#xff0c;刪除鍵確認提示等。 針對高定制化或者固定的振動方式&#xff0c;我們需要有不同的方案實現&#xff0c;馬…

php項目加密源碼

軟件簡介 壓縮包里有多少個php就會被加密多少個PHP、php無需安裝任何插件。源碼全開源 如果上傳的壓縮包里有子文件夾&#xff08;子文件夾里的php文件也會被加密&#xff09;&#xff0c;加密后的壓縮包需要先修復一下&#xff0c;步驟&#xff1a;打開壓縮包 》 工具 》 修…

【云原生】Kubernetes----Ingress對外服務

目錄 引言 一、K8S對外方式 &#xff08;一&#xff09;NodePort 1.作用 2.弊端 3.示例 &#xff08;二&#xff09;externalIPs 1.作用 2.弊端 3.示例 &#xff08;三&#xff09;LoadBalancer 1.作用 2.弊端 &#xff08;四&#xff09;Ingress 二、Ingress的…

Linux文件I/O與標準I/O緩沖機制及性能分析

目錄 1、文件I/O 1.1、數據緩沖機制 1.2、性能影響 2、標準I/O 2.1、數據緩沖機制 2.2、性能影響 3、文件I/O與標準I/O的對比 在Linux中&#xff0c;文件I/O和標準I/O是兩種常見的I/O操作方式&#xff0c;它們在數據緩沖的原理和機制上有所不同。理解這些原理和機制對優…

gitea的git庫備份與恢復

文章目錄 gitea庫的備份與恢復概述筆記實驗環境更新git for windows更新 TortoiseGit備份已經存在的gitea的git庫目錄使用gitea本身來備份所有git庫目錄將gitea庫恢復到新目錄m1m2m3啟動gitea - 此時已經恢復完成FETCH_HEAD 中有硬寫位置再查一下app.ini, 是否改漏了。m1m2 總結…

容器中運行ip addr提示bash: ip: command not found【筆記】

容器中運行ip addr提示bash: ip: command not found 原因沒有安裝ip命令。 rootdocker-desktop:/# ip addr bash: ip: command not found rootdocker-desktop:/# apt-get install -y iproute2

谷歌廣告怎么開戶?Google推廣開戶費用、代運營流程、代理開戶、投放價格

谷歌推廣&#xff08;Google Ads廣告&#xff09;是指Google公司面向全球用戶&#xff0c;在其自有搜索引擎、YouTube視頻、Gmail郵箱等各類自有產品提供的廣告位中&#xff0c;展示的各類互聯網廣告。谷歌廣告&#xff0c;有很多種衍生的叫法&#xff1a;谷歌SEM、谷歌競價、谷…

渦輪流量傳感器

渦輪流量傳感器是一種精密的流量測量儀表&#xff0c;廣泛應用于石油、化工、冶金、科研等領域的計量和控制系統。配備有衛生接頭的渦輪流量傳感器還可以應用于制藥行業。該傳感器的主要工作原理基于流體動力學和電磁感應原理&#xff0c;當流體流經傳感器時&#xff0c;流體的…

cron表達式的講解及其在若依定時任務中的使用

目錄 前言介紹一 cron的結構二 各域的含義三 常用cron表達式 實例1 后臺添加定時任務處理類2 前端新建定時任務信息3 點擊執行一次4 啟動定時任務 前言 在實際項目開發中Web應用有一類不可缺少的&#xff0c;那就是定時任務。 定時任務的場景可以說非常廣泛&#xff0c;比如某…

JS跨頁面或跨JS文件對變量賦值

JS跨頁面或跨JS文件對變量賦值&#xff0c;這是很小的一個問題。 但問題雖小&#xff0c;卻總覺得有點不夠自然&#xff0c;不爽。 為什么呢&#xff1f;訪問一個頁面上的變量不是什么難事&#xff0c;比如用parent.變量名&#xff0c;或者windows名.變量名&#xff0c;都可以…

Day42 代碼隨想錄打卡|二叉樹篇---二叉樹的所有路徑

題目&#xff08;leecode T257&#xff09;&#xff1a; 給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 方法&#xff1a;本題需要對二叉樹中的所有路徑進行遍歷&#xff0c;并且是…

vue-router 源碼分析——2. router-link 組件是如何實現導航的

這是對vue-router 3 版本的源碼分析。 本次分析會按以下方法進行&#xff1a; 按官網的使用文檔順序&#xff0c;圍繞著某一功能點進行分析。這樣不僅能學習優秀的項目源碼&#xff0c;更能加深對項目的某個功能是如何實現的理解。這個對自己的技能提升&#xff0c;甚至面試時…

CSS選擇器和樣式

CSS CSS&#xff1a;選擇器&#xff1a;通配符選擇器&#xff1a;基本選擇器&#xff1a;標簽選擇器&#xff1a;類選擇器&#xff1a;ID選擇器&#xff1a;基本選擇器的優先級別: 群組選擇器:派生選擇器&#xff1a;后代選擇器&#xff1a;子代選擇器&#xff1a;相鄰兄弟選擇…

sed批量修改shell腳本內容

需求:郵件服務器腳本ip做了切換,由原先的11.22.33.44,切換為11.22.33.55 需要把所有使用了11.22.33.44該ip的腳本改為11.22.33.55 示例: #建2個測試文件 cat test1.txt 11.22.33.44 hello 11.22.33.44cat test2.txt 11.22.33.44 world#1.先找出哪些腳本包含該ip grep 11.22.3…

正邦科技(day3)

出廠測試 設備校準 這個需要注意的是校準電流、電壓、電感的時候有時候負感器會裝反&#xff0c;mcu會壞&#xff0c;需要flash一下清空內存

【貓狗識別系統】圖像識別Python+TensorFlow+卷積神經網絡算法+人工智能深度學習

貓狗識別系統。通過TensorFlow搭建MobileNetV2輕量級卷積神經算法網絡模型&#xff0c;通過對貓狗的圖片數據集進行訓練&#xff0c;得到一個進度較高的H5格式的模型文件。然后使用Django框架搭建了一個Web網頁端可視化操作界面。實現用戶上傳一張圖片識別其名稱。 一、前言 …

iptables備份

備份 iptables sudo iptables-save > iptables_backup.txt文件還原

【安裝筆記-20240529-Windows-poedit 翻譯編輯器】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Poedit 翻譯編輯器 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Poedit 翻譯編輯器 前言一、軟件介紹名稱&#xff1a;Poedit主頁官方介紹 二、安裝步驟測試版本&#xff1a;Poedit-3.4.4下載鏈接安裝界面 三、…

華為機械工程師面試問題

在機械工程師的面試中,面試官可能會提出一系列問題,以評估應聘者的專業知識、技能、經驗以及解決問題的能力。以下是一些可能的面試題: 基礎知識與技能: 請解釋機械工程中常用的幾種傳動方式,并比較它們的優缺點。描述一下你在機械設計過程中常用的軟件,并舉例說明你是如…