【數據結構】二叉樹的認識與實現

????????

目錄

二叉樹的概念:?

二叉樹的應用與實現:?

?二叉樹實現接口:

通過前序遍歷的數組"ABD##E#H##CF##G##"構建二叉樹?

?二叉樹節點個數?編輯

二叉樹葉子節點個數?

二叉樹第k層節點個數?

?二叉樹查找值為x的節點?編輯

?二叉樹前序遍歷,中序遍歷,后序遍歷

層序遍歷?

判斷二叉樹是否是完全二叉樹?

二叉樹銷毀?


二叉樹的概念:?

????????在前面的學習中我們認識了樹的概念,今天的我們將學習數中比較特殊的一類:二叉樹。

二叉樹故名思意,這種樹只存在兩個分支,圖形相貌如下:?

?而二叉樹中又存在著特殊的兩類:滿二叉樹和完全二叉樹。

  • 滿二叉樹:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是 ,則它就是滿二叉樹。

    ?
  • ?完全二叉樹:完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹。

二叉樹的性質
1. 若規定根結點的層數為1,則一棵非空二叉樹的第i層上最多有 2^(i-1)個結點。
2. 若規定根結點的層數為1,則深度為h的二叉樹的最大結點數是 2^h-1。
3. 對任何一棵二叉樹, 如果度為0其葉結點個數為n0, 度為2的分支結點個數為n2,則有n0= n2+1。4. 若規定根結點的層數為1,具有n個結點的滿二叉樹的深度,h=log(n+1) (ps: 是log以2
為底,n+1為對數)
5. 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有結點從0開始編號,則對于序號為i的結點有:
1. 若i>0,i位置結點的雙親序號:(i-1)/2;i=0,i為根結點編號,無雙親結點
2. 若2i+1<n,左孩子序號:2i+1,2i+1>=n否則無左孩子
3. 若2i+2<n,右孩子序號:2i+2,2i+2>=n否則無右孩子

二叉樹的應用與實現:?

?二叉樹實現接口:

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>// 類型的定義
typedef char BTDataType;typedef struct BinaryTreeNode
{BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right;
}BTNode;// 函數的聲明// 通過前序遍歷的數組"ABD##E#H##CF##G##"構建二叉樹
BTNode* BinaryTreeCreate(BTDataType* a, int* pi);// 二叉樹銷毀
void BinaryTreeDestory(BTNode* root);// 二叉樹節點個數
int BinaryTreeSize(BTNode* root);// 二叉樹葉子節點個數
int BinaryTreeLeafSize(BTNode* root);// 二叉樹第k層節點個數
int BinaryTreeLevelKSize(BTNode* root, int k);// 二叉樹查找值為x的節點
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);// 二叉樹前序遍歷 
void BinaryTreePrevOrder(BTNode* root);// 二叉樹中序遍歷
void BinaryTreeInOrder(BTNode* root);// 二叉樹后序遍歷
void BinaryTreePostOrder(BTNode* root);// 層序遍歷
void BinaryTreeLevelOrder(BTNode* root);// 判斷二叉樹是否是完全二叉樹
bool BinaryTreeComplete(BTNode* root);

通過前序遍歷的數組"ABD##E#H##CF##G##"構建二叉樹?

// 通過前序遍歷的數組"ABD##E#H##CF##G##"構建二叉樹
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{if (a[(*pi)] == '#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode));if (root == NULL){perror("malloc fail!");return 1;}root->_data = a[(*pi)++];root->_left = BinaryTreeCreate(a, pi);root->_right = BinaryTreeCreate(a, pi);return root;
}

?二叉樹節點個數

// 二叉樹節點個數
int BinaryTreeSize(BTNode* root)
{return root == NULL ? 0 : BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;
}

二叉樹葉子節點個數?

// 二叉樹葉子節點個數
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL){return 0;}if (root->_left == NULL && root->_right == NULL){return 1;}return BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right);
}

二叉樹第k層節點個數?

// 二叉樹第k層節點個數
int BinaryTreeLevelKSize(BTNode* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}return BinaryTreeLevelKSize(root->_left, k - 1) +BinaryTreeLevelKSize(root->_right, k - 1);
}

?二叉樹查找值為x的節點

// 二叉樹查找值為x的節點
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->_data == x)return root;BTNode* n1 = BinaryTreeFind(root->_left, x);if (n1){return n1;}BTNode* n2 = BinaryTreeFind(root->_right, x);if (n2){return n2;}return NULL;
}

?二叉樹前序遍歷,中序遍歷,后序遍歷

?

// 二叉樹前序遍歷 
void BinaryTreePrevOrder(BTNode* root)
{if (root == NULL){printf("null ");return;}printf("%c ", root->_data);BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);
}// 二叉樹中序遍歷
void BinaryTreeInOrder(BTNode* root)
{if (root == NULL){printf("null ");return;}BinaryTreeInOrder(root->_left);printf("%c ", root->_data);BinaryTreeInOrder(root->_right);
}// 二叉樹后序遍歷
void BinaryTreePostOrder(BTNode* root)
{if (root == NULL){printf("null ");return;}BinaryTreePostOrder(root->_left);BinaryTreePostOrder(root->_right);printf("%c ", root->_data);
}

層序遍歷?

void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);printf("%c ", front->_data);if (front->_left)QueuePush(&q, front->_left);if (front->_right)QueuePush(&q, front->_right);}QueueDestroy(&q);
}

判斷二叉樹是否是完全二叉樹?

// 判斷二叉樹是否是完全二叉樹
bool BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL){break;}QueuePush(&q, front->_left);QueuePush(&q, front->_right);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front){QueueDestroy(&q);return false;}}QueueDestroy(&q);return true;
}

二叉樹銷毀?

// 二叉樹銷毀
void BinaryTreeDestory(BTNode* root)
{// 使用后序遍歷的方式考慮銷毀if (root == NULL)return;BinaryTreeDestory(root->_left);BinaryTreeDestory(root->_right);free(root);
}

?代碼完整文件:BinaryTree_implement_by_C_2024_5_27 · 陽區欠/數據結構的學習 - 碼云 - 開源中國 (gitee.com)

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

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

相關文章

XSS+CSRF攻擊

一、前言 在DVWA靶場的XSS攻擊下結合CSRF攻擊完成修改密碼 也就是在具有XSS漏洞的情況下實施CSRF攻擊 二、實驗 環境配置與上一篇博客一致&#xff0c;有興趣可以參考CSRF跨站請求偽造實戰-CSDN博客 首先登錄DVWA&#xff0c;打開XSS模塊 name隨便輸入&#xff0c;message…

嵌入式0基礎開始學習 Ⅲ Linux基礎(1)Linux基本命令

1.APT unbuntu中功能最強大的命令行軟件包管理工具&#xff0c; 用來獲取&#xff0c;安裝&#xff0c;編譯&#xff0c;卸載&#xff0c;查詢軟件包。 工作原理; /etc/apt/sources.list -> 文件 用來指針ubuntu的軟件源服務器…

HQL面試題練習 —— 合并數據

題目來源&#xff1a;京東 目錄 1 題目2 建表語句3 題解 1 題目 已知有數據 A 如下&#xff0c;請分別根據 A 生成 B 和 C。 數據A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…

Android 使用 ActivityResultLauncher 申請權限

前面介紹了 Android 運行時權限。 其中&#xff0c;申請權限的步驟有些繁瑣&#xff0c;需要用到&#xff1a;ActivityCompat.requestPermissions 函數和 onRequestPermissionsResult 回調函數&#xff0c;今天就借助 ActivityResultLauncher 來簡化書寫。 步驟1&#xff1a;創…

基于FPGA的VGA協議實現

文章目錄 一、VGA介紹1.1 VGA原理1.2VGA電路 二、配置三、實現3.1 字符顯示3.2圖片顯示 四、代碼4.1.vga驅動模塊4.2數據模塊4.3按鍵消抖模塊4.4頂層模塊4.5TCL引腳綁定 參考 一、VGA介紹 1.1 VGA原理 VGA接口 最主要的幾根線&#xff1a; VGA其實就是相當于一塊芯片&#…

gcc g++不同版本切換命令

sudo update-alternatives --config g sudo update-alternatives --config gcc ubuntu20.04 切換 gcc/g 版本_ubuntu降低g版本-CSDN博客

YOLOv10嘗鮮測試五分鐘極簡配置

最近清華大學團隊又推出YOLOv10&#xff0c;真是好家伙了。 安裝&#xff1a; pip install supervision githttps://github.com/THU-MIG/yolov10.git下載權重&#xff1a;https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10n.pt 預測&#xff1a; from ult…

Superset,基于瀏覽器的開源BI工具

BI工具是數據分析的得力武器&#xff0c;目前市場上有很多BI軟件&#xff0c;眾所周知的有Tableau、PowerBI、Qlikview、帆軟等&#xff0c;其中大部分是收費軟件或者部分功能收費。這些工具一通百通&#xff0c;用好一個就夠了&#xff0c;重要的是分析思維。 我一直用的Tabl…

【HMGD】STM32/GD32 CAN通信

各種通信協議速度分析 協議最高速度(btis/s)I2C400KCAN1MCAN-FD5M48510MSPI36M CAN協議圖和通信幀 CubeMX CAN配置說明 CAN通信波特率 APB1頻率 / 分頻系數 /&#xff08;BS1 BS2 同步通信段&#xff09;* 1000 ? 42 / 1 / (111) * 1000 ? 14,000 KHz ? 1400000…

吉林大學計科21級《軟件工程》期末考試真題

文章目錄 21級期末考試題一、單選題&#xff08;2分一個&#xff0c;十個題&#xff0c;一共20分&#xff09;二、問答題&#xff08;5分一個&#xff0c;六個題&#xff0c;一共30分&#xff09;三、分析題&#xff08;一個10分&#xff0c;一共2個&#xff0c;共20分&#xf…

前端自定義Echarts 圖的時候,重新渲染,頁面還保存原來的數據

自定義 setAxisSingleOption(optionData){var options this.axisSingleOptionoptions.title.text optionData.title.textoptions.xAxis.data optionData.xAxis.dataoptions.legend.data optionData.legend.dataoptions.series optionData.seriesoptions.grid optionData…

【C語言】10.C語言指針(1)

文章目錄 1.內存和地址1.1 內存1.2 究竟該如何理解編址 2.指針變量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指針變量和解引?操作符&#xff08;*&#xff09;2.2.1 指針變量2.2.2 如何拆解指針類型2.2.3 解引?操作符 2.3 指針變量的?? 3.指針變量類型的意…

匯編:字符串的輸出

在16位匯編程序中&#xff0c;可以使用DOS中斷21h的功能號09h來打印字符串&#xff1b;下面是一個簡單的示例程序&#xff0c;演示了如何在16位匯編程序中打印字符串&#xff1a; assume cs:code,ds:data ? data segmentszBuffer db 0dh,0ah,HelloWorld$ //定義字符串 data …

【C++】哈夫曼編碼:高效的壓縮算法

哈夫曼編碼&#xff1a;高效的壓縮算法 什么是哈夫曼編碼&#xff1f; 哈夫曼編碼是一種用于數據壓縮的無損編碼方法&#xff0c;由David A. Huffman于1952年提出。它利用了字符出現頻率的不均勻性&#xff0c;通過構建最優前綴碼&#xff0c;能夠有效減少數據的冗余&#xf…

Flutter仿照微信實現九宮格頭像

一、效果圖 2、主要代碼 import dart:io; import dart:math;import package:cached_network_image/cached_network_image.dart; import package:flutter/material.dart;class ImageGrid extends StatelessWidget {final List<String> imageUrls; // 假設這是你的圖片URL…

關于Iterator 和ListIterator的詳解

1.Iterator Iterator的定義如下&#xff1a; public interface Iterator<E> {} Iterator是一個接口&#xff0c;它是集合的迭代器。集合可以通過Iterator去遍歷集合中的元素。Iterator提供的API接口如下&#xff1a; forEachRemaining(Consumer<? super E> act…

VS2022通過C++網絡庫Boost.Asio創建一個簡單的同步TCP服務器和客戶端

Boost.Asio是一個用于網絡和異步編程的C庫。它提供了一種跨平臺的方式來處理網絡編程和異步操作&#xff0c;使開發人員能夠創建高性能的網絡應用程序&#xff0c;asio幾乎支持所有你能夠想到的網絡協議&#xff0c;比如tcp、udp、ip、http、icmp等&#xff0c;C通過asio庫可以…

找出第 K 大的異或坐標值

問題 給你一個二維矩陣 matrix 和一個整數 k &#xff0c;矩陣大小為 m x n 由非負整數組成。 矩陣中坐標 (a, b) 的 值 可由對所有滿足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下標從 0 開始計數&#xff09;執行異或運算得到。…

淺談網絡通信(1)

文章目錄 一、認識一些網絡基礎概念1.1、ip地址1.2、端口號1.3、協議1.4、協議分層1.5、協議分層的2種方式1.5.1、OSI七層模型1.5.2、TCP/IP五層模型[!]1.5.2.1、TCP/IP五層協議各層的含義及功能 二、網絡中數據傳輸的基本流程——封裝、分用2.1、封裝2.2、分用2.2.1、5元組 三…

基于大模型和RAG技術實現的開源項目

基于大模型和RAG技術實現的開源項目 為解決大模型的不足&#xff0c;使用RAG技術增強大模型生成內容的針對性和可讀性能力&#xff0c;有很多不錯的開源項目。例如下面的項目。 1 ragflow 優點&#xff1a;可以對文檔和知識庫進行管理&#xff0c;構建不同的知識庫&#xff…