二叉樹創建和遍歷

個人主頁? ? :敲上癮-CSDN博客
二叉樹介紹:二叉樹(詳解)-CSDN博客

目錄

一、二叉樹的創建

二、二叉樹的遍歷

1.前序遍歷

2.中序遍歷

3.后序遍歷

4.層序遍歷

三、相關計算

1.總節點個數計算

2.葉子節點個數計算

3.深度計算


一、二叉樹的創建

????????關于二叉樹的創建和遍歷我們考慮用遞歸來實現。
????????我們通過前序遍歷的數組"ABD##E#H##CF##G##" 來創建數組,其中 '#' 相當于空指針。

頭文件的聲明:

typedef char BTDataType;typedef struct BinaryTreeNode
{BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right;
}BTNode;
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{if (*pi == n)return NULL;int val = a[(*pi)++];if (val == '#')return NULL;BTNode* root = (BTNode*)malloc(sizeof(BTNode));assert(root);root->_data = val;root->_left = BinaryTreeCreate(a, n, pi);root->_right = BinaryTreeCreate(a, n, pi);return root;
}

二、二叉樹的遍歷

????????學習二叉樹結構,最簡單的方式就是遍歷。所謂二叉樹遍歷(Traversal)是按照某種特定的規則,依次對二叉樹中的結點進行相應的操作,并且每個結點只操作一次。訪問結點所做的操作依賴于具體的應用問題。

????????遍歷是二叉樹上最重要的運算之一,也是二叉樹上進行其它運算的基礎。
按照規則,二叉樹的遍歷有:前序/中序/后序的遞歸結構遍歷:
????????1. 前序遍歷(Preorder Traversal 亦稱先序遍歷)——訪問根結點的操作發生在遍歷其左右子樹之前。
????????2. 中序遍歷(Inorder Traversal)——訪問根結點的操作發生在遍歷其左右子樹之中(間)。
????????3. 后序遍歷(Postorder Traversal)——訪問根結點的操作發生在遍歷其左右子樹之后。
由于被訪問的結點必是某子樹的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解釋為根、根的左子樹和根的右子樹。NLR、LNR和LRN分別又稱為先根遍歷、中根遍歷和后根遍歷。

1.前序遍歷

void BinaryTreePrevOrder(BTNode* root)
{if (!root){printf("#");return;}printf("%c", root->_data);BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);
}
//或者這么寫:
void PrevOrder(BTNode* root)
{if (root){printf("%c", root->_data);PrevOrder(root->_left);PrevOrder(root->_right);}
}

2.中序遍歷

void BinaryTreeInOrder(BTNode* root)
{if (!root){printf("#");return;}BinaryTreeInOrder(root->_left);printf("%c", root->_data);BinaryTreeInOrder(root->_right);
}

3.后序遍歷

void BinaryTreePostOrder(BTNode* root)
{if (!root){printf("#");return;}BinaryTreePostOrder(root->_left);BinaryTreePostOrder(root->_right);printf("%c", root->_data);
}

4.層序遍歷

????????層序遍歷是一層一層往下遍歷的,并不是單個方向深入,像以上三種遍歷都可以叫做深度優先遍歷,而層序遍歷也可以叫做廣度優先遍歷,它是不能用遞歸實現的,要實現它我們可以使用一個隊列結構,我們把根節點存入隊列然后對隊列進行操作,把根節點拿出來(Pop)然后把它的左孩子和右孩子依次取出放入隊列,然后再次從隊頭取到根節點重復操作,一次下去直到隊列為空,就能完成層序遍歷。如下:

void BinaryTreeLevelOrder(BTNode* root)
{if (!root)return;Queue pt;//需要構造出一個隊列結構,這里就不在展示QueueInit(&pt);QueuePush(&pt, root);while (!QueueEmpty(&pt)){BTNode* pf = QueueFront(&pt);if (pf)printf("%c", pf->_data);elseprintf("#");QueuePop(&pt);if (pf){QueuePush(&pt, pf->_left);QueuePush(&pt, pf->_right);}}
}

三、相關計算

1.總節點個數計算

????????在計算節點個數的時候,初學著可能會想用一個全局變量,用以上任意方法遍歷并計數。這種方法是可行的但不太可靠。像這些二叉樹相關的計算我們大多數都可以考慮把它化為小問題去分析。如果是空樹的話就是0,如果不是空樹就是1+左樹的節點個數+右樹的節點個數,像這樣左樹又可以分為左樹和右樹去解決,可以不斷的把問題化小。如下:

int BinaryTreeSize(BTNode* root)
{if (!root)return 0;elsereturn BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;
}

2.葉子節點個數計算

這個計算和上一個方法是相似的,不過我們得特別判斷以下是否為葉子節點。如下:

int BinaryTreeLeafSize(BTNode* root)
{if (!root)return 0;if (!root->_left && !root->_right)return 1;return BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right);
}

3.深度計算

????????求一顆樹的深度可以化為就是左子樹的深度和右子樹中的最大深度,而左子樹又可以在化為更小的左右子樹的深度就如此遞推下去,直到遇到空樹才一次回歸(返回),這樣就把大問題化為小問題用遞歸實現。如下:

int BinaryTreeHeight(BTNode* root)
{if (!root)return 0;int v1=BinaryTreeHeight(root->_left);int v2 = BinaryTreeHeight(root->_right);return v1 > v2 ? v1 + 1 : v2 + 1;
}

要注意一點的是千萬不要寫成下面的方式:?

這樣會使一個函數內就有三個遞歸展開,效率會變得非常非常低。?

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

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

相關文章

如何在路由器上安裝代理服務:詳細教程

如何在路由器上安裝代理服務:詳細教程 步驟一:通過漏洞進入路由器系統開啟Telnet服務使用Telnet登錄路由器系統查看系統信息和CPU信息步驟二:交叉編譯MIPS程序 Go對MIPS的支持 安裝TFTP Server使用BusyBox tftp傳輸文件在路由器系統中下載編譯…

?機器學習正則化算法的總結。耗時10個小時完成。?

?純 干 貨~? 目錄 純干貨 1、L1 正則化(Lasso 正則化) 2、L2 正則化(嶺正則化) 3、彈性網絡正則化(Elastic Net 正則化) 4、Dropout 正則化(用于神經網絡) 5、貝葉斯Rid…

海外盲盒小程序:跨文化營銷的利器

在全球化的浪潮下,跨境電商正迎來前所未有的發展機遇。作為這一領域中的新興力量,海外盲盒小程序憑借其獨特的魅力和優勢,正逐漸嶄露頭角,成為跨文化營銷的利器。本文將探討海外盲盒小程序在跨文化營銷中的應用及其帶來的價值。 一…

【30天精通Prometheus:一站式監控實戰指南】第16天:snmp_exporter從入門到實戰:安裝、配置詳解與生產環境搭建指南,超詳細

親愛的讀者們👋 ??歡迎加入【30天精通Prometheus】專欄!📚 在這里,我們將探索Prometheus的強大功能,并將其應用于實際監控中。這個專欄都將為你提供寶貴的實戰經驗。🚀 ??Prometheus是云原生和DevOps的…

【java11】java11新特性之增強String的API

Java11在String類上引入了一系列新的API增強,這些改進顯著提升了開發者在處理字符串時的便捷性和效率。 以下是Java11中增強String API的主要新特性: String.repeat():重復給定次數的字符串。返回連接的字符串。String.isBlank()&#xff1…

ldap協議(常用于統一身份認證)與dict協議(在線詞典)

文章目錄 LDAPDICT LDAP LDAP(Light Directory Access Portocol),輕量目錄訪問協議。 目錄是一個為查詢、瀏覽和搜索而優化的數據庫,它成樹狀結構組織數據,類似文件目錄一樣。 目錄數據庫和關系數據庫不同&#xff0c…

spring security 使用記錄

spring security 使用記錄 Bad credentials配置類密碼匹配 Bad credentials org.springframework.security.authentication.BadCredentialsException: Bad credentialsat org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticatio…

Docker安裝極簡版(三分鐘搞定)

什么是Docker? Docker是一個開源的應用容器引擎,它允許開發者打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。 化。容器是…

日志脫敏功能

前言 數據安全尤為重要,最為簡單的防線就是防止重要信息(身份證、手機號、姓名等)明文顯示,對此需要在數據庫層、日志層等做好數據加解密。 思路 1、編寫需加密的正則模板、加密字段 2、重寫ch.qos.logback.classic.pattern.Me…

簡易圖像處理器的設計

1 概述 Python是一種高級、通用、解釋型的編程語言,由Guido van Rossum于1991年創造。它被設計為易讀易寫的語言,具有簡潔而清晰的語法,使得它成為許多領域的首選語言,如Web開發、科學計算、人工智能、數據分析等。結合本科階段以…

三維地圖校內導航系統解決方案

在如今的數字化時代,越來越多的學校開始實施智慧校園計劃,旨在為學生和教師提供更高效、便捷的學習和教學環境。智慧校園運用互聯網、大數據、人工智能等技術,對校園內各信息進行收集、整合、分析和應用,實現教學、管理、服務等多…

【matlab】繪圖插入并放大/縮小子圖

參考鏈接 代碼分為兩個:繪圖代碼與magnify.m 繪圖代碼就是普通的繪圖代碼,以下為例 %https://zhuanlan.zhihu.com/p/655767542 clc clear close all x 0:pi/100:2*pi; y1 sin(x); plot(x,y1,r-o); hold on y2sin(x)-0.05; y3sin(x)0.05; xlim([0 2*…

C#關鍵字概覽

C#是一種面向對象的編程語言,由微軟開發并作為.NET框架的一部分。它具有豐富的關鍵字,用于定義程序的結構和行為。本文將詳細介紹C#中的關鍵字,包括基本關鍵字、上下文關鍵字以及它們在C#編程中的使用方式。 訪問修飾符 訪問修飾符控制成員…

Python變量age:深入探索其內涵與運用

Python變量age:深入探索其內涵與運用 在Python的世界里,變量age不僅是一個簡單的標識符,它更是一個承載著豐富信息和功能的實體。今天,我們就來深入探索這個看似簡單的age變量,揭示其背后的奧秘和魅力。 四個方面&am…

供應SKYA21001思佳訊芯片現貨

長期供應各進口品牌芯片現貨: SKYA21001 QM11024TR13 QM12113TR13 QM42391 QM45392 QM28005 RF8020TR13 QM77033DTR13 QM56021TR13-5K 885171 QM77043 QM78207 QM77038TR13 SKY58081-11 QPF5752QTR13-5K RF7198TR13-5K SKY58255-11 SKY85720-11 …

Ubuntu中安裝和配置SSH的完全指南

目錄 前言 第1步:安裝SSH服務器 第2步:檢查防火墻設置 第3步:連接到SSH服務器 第4步:配置SSH服務器(可選) 更改SSH端口 禁用root登錄 第5步:公鑰認證(建議) 結論…

XSS Challenges 闖關游戲環境準備:深入指南

在網絡安全領域,理解并掌握跨站腳本攻擊(XSS)的防御技巧至關重要。為了幫助學習者深入實踐XSS攻擊與防御,“XSS Challenges” 闖關游戲提供了一個實操平臺。本文將詳細介紹如何準備這一環境。 1. 環境準備概述 XSS Challenges 闖…

Kubernetes 之 Secret

Kubernetes 之 Secret Secret 的定義 Secret 解決了密碼、token、秘鑰等敏感數據的配置問題,它避免了把這些敏感數據直接暴露在鏡像或者 Pod 的配置文件中。但是它只是一種相對安全的策略,我們還是可以在容器內找到這些信息。 Secret 的認證方式 認證…

eclipse-向Console控制臺輸出信息

首先這里主要用到的是org.eclipse.ui.console這個包,所以現在順道先來了解一下: org.eclipse.ui.console是一個可擴展的console視圖插件,利用它可以實現各種console,并把它們顯示出來。該插件本身就實現了一個Message Console&…

本地 Java API 訪問云上 HDFS 集群的問題與解決

前言 這篇文章默認是已經在云上配置好了 Haoop 集群,因此本文主要是記錄一些可能會出現錯誤的地方。 如果還不會配置 Hadoop 集群,那么可以參考本專欄的另一篇文章:云上配置 Hadoop 集群詳解 另外在進行本文的學習之前也建議先看看該文章&…