數據結構--二叉樹遍歷

目錄

1.介紹

(1)前序遍歷

(2)定義結構體

(3)前序遍歷實現

(4)中序遍歷實現

(5)二叉樹的節點個數

(6)二叉樹樹葉節點個數

(7)二叉樹的高度

(8)二叉樹節點的開辟

(9)建立一個測試二叉樹

(10)測試二叉樹相關函數的功能

(11)第k層的數據個數

(12)二叉樹里面查找節點


1.介紹

(1)前序遍歷

前序遍歷就是針對于樹根而言的,就是這個樹的樹根是先被我們遍歷的,因為這個二叉樹里面劃分為樹根,左子樹和右子樹,這個前中后表示的就是這三個里面的樹根的訪問順序,樹根先被訪問就是前序遍歷,樹根是第二個被訪問的就是中序遍歷,最后被訪問到就是后序遍歷;

(2)定義結構體

下面看一下這個前序遍歷的具體實現;

首先我們要進行這個結構體的定義,這個結構體就是表示的每一個節點,具體來講就是包括這個節點數據,節點的左節點,節點的右節點;

(3)前序遍歷實現

這個代碼里面的N表示的就是這個位置的節點是不存在的,因為不是所有的節點都存在,就是標準情況下,一個節點應該是有兩個子節點的,一個左節點,一個右節點,但是不可避免的有的節點是沒有左節點,或者是沒有右節點的,這個時候我們不會不打印任何數據,而是使用N代替說明這個位置的節點不存在;

(4)中序遍歷實現

這個就是先訪問左邊的節點,再訪問根節點,最后訪問右邊的節點,沒有字節點的就會打印N代替

(5)二叉樹的節點個數

這個地方是使用的遞歸的方法,如果自己沒有根節點,說明這個二叉樹的節點的個數是0,否則就是用遞歸去進行節點個數的計算;

(6)二叉樹樹葉節點個數

這個也是分為有樹根節點,沒有樹根節點,以及正常的使用遞歸進行計算的情況,這個時候使用遞歸進行計算就不需要加上1,因為上面的加1表示這個要加上樹根節點,但是這個地方計算的是樹葉節點,所以不需要加上1;

(7)二叉樹的高度

這個地方是使用這個leftheight表示這個左子樹的高度,rightheight表示這個右子樹的高度,這個地方其實是可以直接寫到返回值里面的,但是這個地方使用的是遞歸,如果不進行這個臨時變量的定義而是直接寫到這個return里面,這個調用的次數就會增加,放到oj里面運行就不會通過,顯示這個運行時間過長,我們定義兩個中間變量就可以去解決這個問題;

(8)二叉樹節點的開辟

使用malloc函數開辟內存空間,需要包含對應的文件stdlib.h

(9)建立一個測試二叉樹

調用上面的buynode函數進行這個節點開辟,并建立不同的節點之間的連接關系,最后返回第一個節點;

(10)測試二叉樹相關函數的功能

打印輸出這個二叉樹的高度,節點個數,樹葉節點個數進行這個功能的測試;

(11)第k層的數據個數

使用遞歸,把下一層即k-1層的左子樹和右子樹節點數量的和作為這個返回值;

(12)二叉樹里面查找節點

這個里面就是查找某一個特定的節點,這個節點作為返回值,我們定義兩個臨時變量作為左子樹和右子樹的返回值,如果左子樹找到這個節點,我們就可以直接返回,否則的話,我們就需要去右子樹去查找,找到這個節點后作為返回值,如果左子樹,右子樹找不到的話就返回NULL;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int btdatatype;
typedef struct binarytreenode
{btdatatype data;struct binarytree* left;struct binarytree* right;
}btnode;void prevorder(btnode* root)
{if (root == NULL){printf("N ");return;}printf("%d ", root->data);prevorder(root->left);prevorder(root->right);
}void inorder(btnode* root)
{if (root == NULL){printf("N ");return;}inorder(root->left);printf("%d ", root->data);inorder(root->right);
}int treesize(btnode* root)
{if (root == NULL){return 0;}return treesize(root->left) + treesize(root->right) + 1;
}int leafsize(btnode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return leafsize(root->left) + leafsize(root->right);
}int heightsize(btnode* root)
{if (root == NULL)return 0;int leftheight = heightsize(root->left);int rightheight = heightsize(root->right);return leftheight > rightheight ? heightsize(root->left) + 1 : heightsize(root->right) + 1;
}int treesizek(btnode* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}return treesizek(root->left, k - 1) + treesizek(root->right, k - 1);
}//二叉樹里面查找指定的節點
btnode* treefind(btnode* root, btdatatype x)
{if (root == NULL){return NULL;}if (root->data == x){return root;}btnode* ret1 = treefind(root->left, x);if (ret1){return ret1;}btnode* ret2 = treefind(root->right, x);if (ret2){return ret2;}return NULL;
}btnode* buynode(int x)
{btnode* node = (btnode*)malloc(sizeof(btnode));if (node == NULL){perror("malloc fail");return;}node->data = x;node->left = NULL;node->right = NULL;
}btnode* creattree()
{btnode* node1 = buynode(1);btnode* node2 = buynode(2);btnode* node3 = buynode(3);btnode* node4 = buynode(4);btnode* node5 = buynode(5);btnode* node6 = buynode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;
}
int main()
{btnode* root = creattree();prevorder(root);printf("\n");inorder(root);printf("\n");int size = treesize(root);printf("treesize:%d\n", size);int size2 = leafsize(root);printf("leafsize:%d\n", size2);int size3 = heightsize(root);printf("heightsize:%d\n", size3);int size4 = treesizek(root,3);printf("treesizek:%d\n", size4);return 0;
}

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

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

相關文章

數倉工具—Hive語法之宏(Macro)

Hive中的宏 許多關系型數據庫,如Teradata,支持宏(Macro)函數。在關系數據庫管理系統(RDBMS)中,宏存儲在數據字典中。用戶可以共享宏,并根據需要執行它們。Hive宏與關系型數據庫中的宏略有不同。在本文中,我們將檢查什么是宏,它的語法,如何使用它們,以及一些宏的示…

java 字段 大于4000拆分

java 字段 大于4000拆分 public List<String> splitJsonIfNecessary(String jsonStr) {List<String> result new ArrayList<>();while (jsonStr.length() > Constant.MAX_LENGTH) {// 直接按字符數截取&#xff0c;不考慮JSON結構String part jsonStr.s…

東軟醫療 踩在中國醫療科技躍遷的風口上

恐怕沒有哪一家本土醫療裝備企業能像東軟醫療一樣&#xff0c;每一段成長的升維都發生在中國醫療科技躍遷史最重要的節點上。 在工業制造領域&#xff0c;醫療裝備產業由于涉及數十個學科領域&#xff0c;其技術復合程度毫不遜于今天公眾所熟知的EUV光刻機&#xff0c;是一門技…

【TES807】 基于XCKU115 FPGA的雙FMC接口萬兆光纖傳輸信號處理平臺

板卡概述 TES807是一款基于千兆或者萬兆以太網傳輸的雙FMC接口信號處理平臺。該平臺采用XILINX的Kintex UltraSacle系列FPGA&#xff1a;XCKU115-2FLVF1924I作為主處理器&#xff0c;FPGA外掛兩組72位DDR4 SDRAM&#xff0c;用來實現超大容量數據緩存&#xff0c;DDR4的最高數據…

08-8.5.1 歸并排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以…

Linux容器時間隔離性測試

在宿主機和容器內同時執行date命令獲取時間 date可以看到宿主機和容器內的時間一致 在宿主機修改時間 date -s "2022-01-01 12:00:00"在宿主機和容器內同時執行date命令獲取時間 date 可以看到時間都修改為了2022年 在宿主機執行命令將時間修改回去 sudo date -s &qu…

《云原生安全攻防》-- 容器攻擊案例:Docker容器逃逸

當攻擊者獲得一個容器環境的shell權限時&#xff0c;攻擊者往往會嘗試進行容器逃逸&#xff0c;利用容器環境中的錯誤配置或是漏洞問題&#xff0c;從容器成功逃逸到宿主機&#xff0c;從而獲取到更高的訪問權限。 在本節課程中&#xff0c;我們將詳細介紹一些常見的容器逃逸方…

摸魚大數據——Kafka——kafka tools工具使用

可以在可視化的工具通過點擊來操作kafka完成主題的創建&#xff0c;分區等操作 注意: 安裝完后桌面不會有快捷方式,需要去電腦上搜索,或者去自己選的安裝位置找到發送快捷方式到桌面! 連接配置 創建主題 刪除主題 主題下的數據查看 數據顯示問題說明 修改工具的數據顯示類型 發…

設計模式使用場景實現示例及優缺點(行為型模式——命令模式)

從前&#xff0c;在一個美麗而神秘的王國里&#xff0c;住著一位智慧而仁慈的國王。他不僅以其公正和睿智著稱&#xff0c;還因為他對知識的熱愛和追求。他的王國繁榮昌盛&#xff0c;人們生活幸福安康。但即便如此&#xff0c;國王知道&#xff0c;要維持這種繁榮與和平&#…

編程參考 - Rule of Three and the Rule of Five in C++

C 中的 "三規則 "和 "五規則 "是管理類中資源管理函數&#xff08;特殊成員函數&#xff09;的準則。這些規則有助于確保類正確一致地管理動態內存、文件句柄或網絡連接等資源。 The Rule of Three and the Rule of Five in C are guidelines for managing…

【C++題解】1168. 歌唱比賽評分

問題&#xff1a;1168. 歌唱比賽評分 類型&#xff1a;數組找數 題目描述&#xff1a; 四&#xff08;1&#xff09; 班要舉行一次歌唱比賽&#xff0c;以選拔更好的苗子參加校的歌唱比賽。評分辦法如下&#xff1a;設 N 個評委&#xff0c;打 N 個分數&#xff08; 0≤每個分…

Linux C語言基礎 day10

目錄 學習目標&#xff1a; 學習內容&#xff1a; 1.指針指向數組 1.1 指針與數組的關系 1.2 指針與一維數組關系實現 1.2.1 指針與一維數組的關系 1.2.2 指針指向一維整型數組作為函數參數傳遞 課外作業&#xff1a; 學習目標&#xff1a; 一周掌握 C基礎知識 學習內…

卡碼網語言基礎課 | 10. 平均績點

目錄 1、問題描述2、知識點① 字符串格式化輸出② 保留小數 3、代碼 1、問題描述 題目描述&#xff1a;每門課的成績分為A、B、C、D、F五個等級&#xff0c;為了計算平均績點&#xff0c;規定A、B、C、D、F分別代表4分、3分、2分、1分、0分。 輸入描述&#xff1a;有多組測試…

RandomAccessFile詳細總結

RandomAccessFile 是 Java 中一個非常特殊的類&#xff0c;它既可以用來讀取文件&#xff0c;也可以用來寫入文件。與其他 IO 類&#xff08;如 FileInputStream 和 FileOutputStream&#xff09;不同&#xff0c;RandomAccessFile 允許您跳轉到文件的任何位置&#xff0c;從那…

【全面介紹Pip換源】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

CV11_模型部署pytorch轉ONNX

如果自己的模型中的一些算子&#xff0c;ONNX內部沒有&#xff0c;那么需要自己去實現。 1.1 配置環境 安裝ONNX pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple 安裝推理引擎ONNX Runtime pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/si…

基于Java的斗地主游戲案例開發(做牌、洗牌、發牌、看牌

package Game;import java.util.ArrayList; import java.util.Collections;public class PokerGame01 {//牌盒//?3 ?3static ArrayList<String> list new ArrayList<>();//靜態代碼塊//特點&#xff1a;隨著類的加載而在加載的&#xff0c;而且只執行一次。stat…

底軟驅動 | C++內存相關

文章目錄 C內存相關C內存分區C對象的成員函數存放在內存哪里 堆和棧的區別堆和棧的訪問效率“野指針”有了malloc/free為什么還要new/deletealloca內存崩潰C內存泄漏的幾種情況內存對齊柔性數組參考推薦閱讀 C內存相關 本篇介紹了 C 內存相關的知識。 C內存分區 在C中&#…

力扣第八題——字符串轉換整數

題目介紹 請你來實現一個 myAtoi(string s) 函數&#xff0c;使其能將字符串轉換成一個 32 位有符號整數。 函數 myAtoi(string s) 的算法如下&#xff1a; 空格&#xff1a;讀入字符串并丟棄無用的前導空格&#xff08;" "&#xff09;符號&#xff1a;檢查下一個字…

TCP重傳、滑動窗口、流量控制、擁塞控制機制

目錄 1、TCP重傳機制超時重傳快速重傳 2、滑動窗口3、流量控制4、擁塞控制1、慢啟動2、擁塞避免3、擁塞發生 1、TCP重傳機制 TCP 針對數據包丟失的情況&#xff0c;會用重傳機制解決。 超時重傳 就是在發送數據時&#xff0c;設定一個定時器&#xff0c;當超過指定的時間還沒…