国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘

這篇具有很好參考價值的文章主要介紹了【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1 -> 樹的概念及結構

1.1 -> 樹的概念

1.2 -> 樹的相關概念

1.3 -> 樹的表示

1.4 -> 樹在實際中的運用(表示文件系統(tǒng)的目錄樹結構)

2 -> 二叉樹概念及結構

2.1 -> 二叉樹的概念

2.2 -> 現(xiàn)實中的二叉樹

2.3 -> 特殊的二叉樹

2.4 -> 二叉樹的性質

2.5 -> 二叉樹的存儲結構

3 -> 二叉樹的順序結構及實現(xiàn)

3.1 -> 二叉樹的順序結構

3.2 -> 堆的概念及結構

3.3 -> 堆的實現(xiàn)

3.3.1 -> 堆向下調整算法

3.3.2 -> 堆的創(chuàng)建

3.3.3 -> 建堆的時間復雜度

3.3.4 -> 堆的插入

3.3.5 -> 堆的刪除

3.3.6 -> 堆的代碼實現(xiàn)

Heap.h

Heap.c

3.4 -> 堆的應用

3.4.1 -> 堆排序

4 -> 二叉樹鏈式結構的實現(xiàn)

4.1 -> 前置說明

4.2 -> 二叉樹的遍歷

4.2.1 -> 前序、中序和后序遍歷

?4.3 -> 節(jié)點個數(shù)以及高度


【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

1 -> 樹的概念及結構

1.1 -> 樹的概念

樹是一種非線性的數(shù)據(jù)結構,它是由n(n >= 0)個有限結點組成一個具有層次關系的集合。把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,葉朝下。

  • 有一個特殊的結點,稱為根結點,根結點沒有前驅結點。
  • 除根結點外,其余結點被分成M(M > 0)個互不相交的集合T1、T2、……、Tn,其中每一個集合Ti(1 <= i <= m)又是一棵結構與樹類似的子樹。每棵樹的根結點有且只有一個前驅,可以有0個或多個后繼。
  • 樹是遞歸定義的。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

注:

樹形結構中,子樹之間不能有交集,否則就不是樹形結構。

1.2 -> 樹的相關概念

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

節(jié)點的度:一個節(jié)點含有的子樹的個數(shù)稱為該節(jié)點的度; 如上圖:A的為6
葉節(jié)點或終端節(jié)點:度為0的節(jié)點稱為葉節(jié)點; 如上圖:B、C、H、I...等節(jié)點為葉節(jié)點
非終端節(jié)點或分支節(jié)點:度不為0的節(jié)點; 如上圖:D、E、F、G...等節(jié)點為分支節(jié)點
雙親節(jié)點或父節(jié)點:若一個節(jié)點含有子節(jié)點,則這個節(jié)點稱為其子節(jié)點的父節(jié)點; 如上圖:A是B的父節(jié)點
孩子節(jié)點或子節(jié)點:一個節(jié)點含有的子樹的根節(jié)點稱為該節(jié)點的子節(jié)點; 如上圖:B是A的孩子節(jié)點
兄弟節(jié)點:具有相同父節(jié)點的節(jié)點互稱為兄弟節(jié)點; 如上圖:B、C是兄弟節(jié)點
樹的度:一棵樹中,最大的節(jié)點的度稱為樹的度; 如上圖:樹的度為6
節(jié)點的層次:從根開始定義起,根為第1層,根的子節(jié)點為第2層,以此類推
樹的高度或深度:樹中節(jié)點的最大層次; 如上圖:樹的高度為4
堂兄弟節(jié)點:雙親在同一層的節(jié)點互為堂兄弟;如上圖:H、I互為兄弟節(jié)點
節(jié)點的祖先:從根到該節(jié)點所經(jīng)分支上的所有節(jié)點;如上圖:A是所有節(jié)點的祖先
子孫:以某節(jié)點為根的子樹中任一節(jié)點都稱為該節(jié)點的子孫。如上圖:所有節(jié)點都是A的子孫
森林:由m(m>0)棵互不相交的樹的集合稱為森林;

1.3 -> 樹的表示

樹結構相對線性表比較復雜,要存儲表示起來比較麻煩,既然保存值域,也要保存結點和結點之間的關系,實際中樹有很多種表示方式,如:雙親表示法、孩子表示法、孩子雙親表示法以及孩子兄弟表示法等。最常用的是孩子兄弟表示法。

#include <iostream>
using namespace std;

typedef int DataType;

typedef struct Node
{
	struct Node* _firstChild1; // 第一個孩子結點
	struct Node* _pNextBrother; // 指向其下一個兄弟結點
	DataType _data; // 結點中的數(shù)據(jù)域
}Node;

int main()
{

	return 0;
}

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

1.4 -> 樹在實際中的運用(表示文件系統(tǒng)的目錄樹結構)

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

2 -> 二叉樹概念及結構

2.1 -> 二叉樹的概念

一棵二叉樹是結點的一個有限集合,該集合:

  1. 或為空
  2. 由一個根結點加上兩顆分別稱為左子樹和右子樹的二叉樹組成

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

從上圖可以看出:

  1. 二叉樹不存在度大于2的結點
  2. 二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹

注:

對于任意二叉樹都是由以下幾種情況復合而成的:

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

2.2 -> 現(xiàn)實中的二叉樹

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

2.3 -> 特殊的二叉樹

  1. 滿二叉樹:一個二叉樹,如果每一個層的結點數(shù)都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數(shù)為K,且結點總數(shù)是,則它就是滿二叉樹。
  2. 完全二叉樹:完全二叉樹是效率很高的數(shù)據(jù)結構,完全二叉樹是由滿二叉樹引出的。對于深度為K的,有n個結點的二叉樹,當且僅當每一個結點都與深度為K的滿二叉樹中編號從1至n的結點一一對應時稱為完全二叉樹。要注意的是滿二叉樹是一種特殊的完全二叉樹。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

2.4 -> 二叉樹的性質

  1. 若規(guī)定根結點的層數(shù)為1,則一棵非空二叉樹的第i層上最多有個結點。
  2. 若規(guī)定根結點的層數(shù)為1,則深度為h的二叉樹的最大結點數(shù)是。
  3. 對任何一棵二叉樹,如果度為0其葉結點個數(shù)為,度為2的分支結點個數(shù)為,則有【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言。
  4. 若規(guī)定根結點的層數(shù)為1,具有n個結點的滿二叉樹的深度,【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言,(ps:【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言是log以2為底,n+1為對數(shù))。
  5. 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數(shù)組順序對所有結點從0開始編號,則對于序號為i的結點有:
  • 若i > 0,i位置結點的雙親序號:(i - 1) / 2;i = 0,i為根結點編號,無雙親結點
  • 若2i + 1 < n,左孩子序號:2i + 1,2i + 1 >= n否則無左孩子
  • 若2i + 2?< n,右孩子序號:2i + 2,2i + 2 >= n否則無右孩子

2.5 -> 二叉樹的存儲結構

二叉樹一般可以使用兩種結構存儲,一種順序結構,一種鏈式結構。

1. 順序存儲:

順序結構存儲就是使用數(shù)組來存儲,一般使用數(shù)組只適合表示完全二叉樹,因為不是完全二叉樹會有空間的浪費。而現(xiàn)實中使用中只有堆才會使用數(shù)組來存儲。二叉樹順序存儲在物理上是一個數(shù)組,在邏輯上是一顆二叉樹。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

2. 鏈式存儲:

二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。 通常的方法是鏈表中每個結點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址 。鏈式結構又分為二叉鏈和三叉鏈。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

#include <iostream>
using namespace std;

typedef int BTDataType;

// 二叉鏈
struct BinaryTreeNode
{
	struct BinTreeNode* _pLeft; // 指向當前節(jié)點左孩子
	struct BinTreeNode* _pRight; // 指向當前節(jié)點右孩子
	BTDataType _data; // 當前節(jié)點值域
};

// 三叉鏈
struct BinaryTreeNode
{
	struct BinTreeNode* _pParent; // 指向當前節(jié)點的雙親
	struct BinTreeNode* _pLeft; // 指向當前節(jié)點左孩子
	struct BinTreeNode* _pRight; // 指向當前節(jié)點右孩子
	BTDataType _data; // 當前節(jié)點值域
};

3 -> 二叉樹的順序結構及實現(xiàn)

3.1 -> 二叉樹的順序結構

普通的二叉樹不適合用數(shù)組存儲,因為可能會存在大量的空間浪費。而完全二叉樹更適合使用順序結構存儲。現(xiàn)實中我們通常把堆(一種二叉樹)使用順序結構的數(shù)組來存儲,需要注意的是這里的堆和操作系統(tǒng)虛擬進程地址空間中的堆是兩回事,一個是數(shù)據(jù)結構,一個是操作系統(tǒng)中內存管理的一塊區(qū)域分段。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

3.2 -> 堆的概念及結構

如果有一個關鍵碼的集合?,把它的所有元素按完全二叉樹的順序存儲方式存儲在一個一維數(shù)組中,并滿足:【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言(【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言) i = 0,1,2,……,則稱為小堆(或大堆)。將根結點的最大的堆叫做最大堆或大根堆,根結點最小的堆叫做最小堆或小根堆。

堆的性質:

  • 堆中某個結點的值總是不大于或不小于其父節(jié)點的值;
  • 堆總是一棵完全二叉樹。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

3.3 -> 堆的實現(xiàn)

3.3.1 -> 堆向下調整算法

現(xiàn)在給出一個數(shù)組,邏輯上看做一棵完全二叉樹。我們通過從根結點開始的向下調整算法可以把它調整成一個小堆。向下調整算法有一個前提:左右子樹必須是一個堆,才能調整。

int arr[] = {27,15,19,18,28,34,65,49,25,37};

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

3.3.2 -> 堆的創(chuàng)建

int arr[] = {1,5,3,8,7,6};

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

3.3.3 -> 建堆的時間復雜度

因為堆是完全二叉樹,而滿二叉樹也是完全二叉樹,此處為了簡化使用滿二叉樹來證明(時間復雜度本來看的就是近似值,多幾個結點不影響結果)。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

因此:建堆的時間復雜度為O(N).

3.3.4 -> 堆的插入

先插入一個10到數(shù)組的尾上,再進行向上調整算法,直到滿足堆。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

3.3.5 -> 堆的刪除

刪除堆是刪除堆頂?shù)臄?shù)據(jù),將堆頂?shù)臄?shù)據(jù)根最后一個數(shù)據(jù)一換,然后刪除數(shù)組最后一個數(shù)據(jù),再進行向下調整算法。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

3.3.6 -> 堆的代碼實現(xiàn)

Heap.h
#pragma once

#define  _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int HPDataType;

typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}HP;

// 堆的初始化
void HeapInit(HP* php);

// 堆的銷毀
void HeapDestory(HP* php);

// 堆的向上調整
void AdjustUp(HPDataType* a, int child);

// 堆的向下調整
void AdjustDown(HPDataType* a, int child);

// 堆的插入
void HeapPush(HP* php, HPDataType x);

// 堆的刪除
void HeapPop(HP* php);

// 取堆頂?shù)臄?shù)據(jù)
HPDataType HeapTop(HP* php);

// 堆的數(shù)據(jù)個數(shù)
int HeapSize(HP* php);

// 堆的判空
bool HeapEmpty(HP* php);
Heap.c
#include "Heap.h"

// 堆的初始化
void HeapInit(HP* php)
{
	assert(php);

	php->a = NULL;
	php->size = 0;
	php->capacity = 0;
}

// 堆的銷毀
void HeapDestory(HP* php)
{
	assert(php);

	free(php->a);
	php->a = NULL;
	php->capacity = php->capacity = 0;
}

void Swap(HPDataType* p1, HPDataType* p2)
{
	HPDataType tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

// 堆的向上調整
void AdjustUp(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	//while (parent >= 0)
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);

			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

// 堆的向下調整
void AdjustDown(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	//while (parent >= 0)
	while (child > 0)
	{
		if (a[child] < a[parent])
		{
			HPDataType tmp = a[child];
			a[child] = a[parent];
			a[parent] = tmp;

			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

// 堆的插入
void HeapPush(HP* php, HPDataType x)
{
	assert(php);
	if (php->size == php->capacity)
	{
		int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;
		HPDataType* tmp = (HPDataType*)realloc(php->a, newCapacity * sizeof(HPDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		php->a = tmp;
		php->capacity = newCapacity;
	}

	php->a[php->size] = x;
	php->size++;

	AdjustDwon(php->a, php->size - 1);
}

// 堆的刪除
void HeapPop(HP* php)
{
	assert(php);
	assert(!HeapEmpty(php));

	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;

	AdjustDown(php->a, php->size, 0);
}

// 取堆頂?shù)臄?shù)據(jù)
HPDataType HeapTop(HP* php)
{
	assert(php);
	assert(!HeapEmpty(php));

	return php->a[0];
}


// 堆的數(shù)據(jù)個數(shù)
int HeapSize(HP* php)
{
	assert(php);

	return php->size;
}

// 堆的判空
bool HeapEmpty(HP* php)
{
	assert(php);

	return php->size == 0;
}

3.4 -> 堆的應用

3.4.1 -> 堆排序

堆排序即利用堆的思想來進行排序,總共分兩個步驟:

1. 建堆

  • 升序:建大堆
  • 降序:建小堆

2. 利用堆刪除思想來進行排序

建堆和堆刪除中都用到了向下調整,因此掌握了向下調整,就可以完成堆排序。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

4 -> 二叉樹鏈式結構的實現(xiàn)

4.1 -> 前置說明

手動快速創(chuàng)建簡單的二叉樹:

typedef int BTDataType;

typedef struct BinaryTreeNode
{
 BTDataType _data;
 struct BinaryTreeNode* _left;
 struct BinaryTreeNode* _right;
}BTNode;

BTNode* CreatBinaryTree()
{
 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;
}

注:

上述代碼并不是創(chuàng)建二叉樹的方式。

4.2 -> 二叉樹的遍歷

4.2.1 -> 前序、中序和后序遍歷

學習二叉樹結構,最簡單的方式就是遍歷。所謂二叉樹遍歷(Traversal)是按照某種特定的規(guī)則,依次對二叉樹中的節(jié)點進行相應的操作,并且每個節(jié)點只操作一次。訪問結點所做的操作依賴于具體的應用問題。 遍歷是二叉樹上最重要的運算之一,也是二叉樹上進行其它運算的基礎。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

按照規(guī)則,二叉樹的遍歷有:前序/中序/后序的遞歸結構遍歷:

  1. 前序遍歷(Preorder Traversal 亦稱先序遍歷)——訪問根結點的操作發(fā)生在遍歷其左右子樹之前。
  2. 中序遍歷((Inorder Traversal)——訪問根結點的操作發(fā)生在遍歷其左右子樹之中(間)。
  3. 后序遍歷(Postorder Traversal)——訪問根結點的操作發(fā)生在遍歷其左右子樹之后。
由于被訪問的結點必是某子樹的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解釋為根、根的左子樹和根的右子樹。NLR、LNR和LRN分別又稱為先根遍歷、中根遍歷和后根遍歷。
前序遍歷:
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);
}

后序遍歷:

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}

4.2.2 -> 層序遍歷

層序遍歷:除了先序遍歷、中序遍歷、后序遍歷外,還可以對二叉樹進行層序遍歷。設二叉樹的根節(jié)點所在層數(shù)為1,層序遍歷就是從所在二叉樹的根節(jié)點出發(fā),首先訪問第一層的樹根節(jié)點,然后從左到右訪問第2層上的節(jié)點,接著是第三層的節(jié)點,以此類推,自上而下,自左至右逐層訪問樹的結點的過程就是層序遍歷。

【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘,數(shù)據(jù)結構,數(shù)據(jù)結構,開發(fā)語言,visualstudio,后端,c語言

層序遍歷:

void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);

	if (root)
		QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);

		printf("%d ", front->data);

		if(front->left)
			QueuePush(&q, front->left);

		if (front->right)
			QueuePush(&q, front->right);
	}

	printf("\n");

	QueueDestroy(&q);
}

?4.3 -> 節(jié)點個數(shù)以及高度

// 求節(jié)點的個數(shù)
int BTreeSize(BTNode* root)
{
	/*if (root == NULL)
		return 0;

	return BTreeSize(root->left)
		+ BTreeSize(root->right)
		+ 1;*/

	return root == NULL ? 0 : BTreeSize(root->left)
							+ BTreeSize(root->right) + 1;
}

// 求葉子節(jié)點的個數(shù)
int BTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}

	if (root->left == NULL
		&& root->right == NULL)
	{
		return 1;
	}

	return BTreeLeafSize(root->left)
		+ BTreeLeafSize(root->right);
}

// 求二叉樹的高度
int BTreeHeight(BTNode* root)
{
	if (root == NULL)
		return 0;

	int leftHeight = BTreeHeight(root->left);
	int rightHeight = BTreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

// 二叉樹第k層結點個數(shù)
int BTreeLevelKSize(BTNode* root, int k)
{
	assert(k > 0);

	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return BTreeLevelKSize(root->left, k - 1)
		+ BTreeLevelKSize(root->right, k - 1);
}

// 二叉樹查找值為x的結點
BTNode* BTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;

	if (root->data == x)
		return root;

	BTNode* ret1 = BTreeFind(root->left, x);
	if (ret1)
		return ret1;

	BTNode* ret2 = BTreeFind(root->right, x);
	if (ret2)
		return ret2;

	return NULL;
}

感謝各位大佬支持?。?!

大佬們互三啦?。。?/strong>文章來源地址http://www.zghlxwxcb.cn/news/detail-838967.html

到了這里,關于【海賊王的數(shù)據(jù)航海:利用數(shù)據(jù)結構成為數(shù)據(jù)海洋的霸主】探究二叉樹的奧秘的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【海賊王的數(shù)據(jù)航?!颗判颉苯舆x擇排序|堆排序

    【海賊王的數(shù)據(jù)航?!颗判颉苯舆x擇排序|堆排序

    目錄 1 - 選擇排序 1.1 - 基本思想 1.2 - 直接選擇排序 1.2.1 - 代碼實現(xiàn) 1.3 - 堆排序 1.3.1 - 代碼實現(xiàn) 每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。 在元素集合arr[i] -- arr[n - 1]中選擇關鍵碼最大(或最小)的數(shù)據(jù)

    2024年03月19日
    瀏覽(17)
  • 【海賊王的數(shù)據(jù)航?!颗判颉拍顋直接插入排序|希爾排序

    【海賊王的數(shù)據(jù)航?!颗判颉拍顋直接插入排序|希爾排序

    目錄 1 - 排序的概念及其運用 1.1 - 排序的概念 1.2 - 常見的排序算法 2 - 插入排序 2.1 - 基本思想 2.2 - 直接插入排序 2.2.1 - 代碼實現(xiàn) 2.3 - 希爾排序(縮小增量排序) 2.3.1 - 代碼實現(xiàn) 排序 :所謂排序,就是使一串記錄,按照其中的某個或某些的大小,遞增或遞減的排列起來的

    2024年03月25日
    瀏覽(23)
  • 【海賊王的數(shù)據(jù)航?!繒r間復雜度 | 空間復雜度

    【海賊王的數(shù)據(jù)航?!繒r間復雜度 | 空間復雜度

    目錄 1 - 算法效率 1.1 - 如何衡量一個算法的好壞? 1.2 - 算法的復雜度 2 - 時間復雜度 2.1 - 時間復雜度的概念 2.2 - 大O的漸進表示法 2.3 - 常見時間復雜度計算 3 - 空間復雜度 4 - 常見復雜度對比 對于以下斐波那契數(shù)列: 用遞歸實現(xiàn)斐波那契數(shù)列,看上去代碼十分簡潔,但簡潔一

    2024年03月14日
    瀏覽(27)
  • 大學生bootstrap框架網(wǎng)頁作業(yè)成品 web前端大作業(yè)期末源碼 航海王html+jquery+bootstrap響應式網(wǎng)頁制作模板 學生海賊王動漫bootstrap框架網(wǎng)站作品

    大學生bootstrap框架網(wǎng)頁作業(yè)成品 web前端大作業(yè)期末源碼 航海王html+jquery+bootstrap響應式網(wǎng)頁制作模板 學生海賊王動漫bootstrap框架網(wǎng)站作品

    HTML實例網(wǎng)頁代碼, 本實例適合于初學HTML的同學。該實例里面有設置了css的樣式設置,有div的樣式格局,這個實例比較全面,有助于同學的學習,本文將介紹如何通過從頭開始設計個人網(wǎng)站并將其轉換為代碼的過程來實踐設計。 ?精彩專欄推薦???????????? ? 【作者主頁

    2024年02月11日
    瀏覽(32)
  • C(結構體指針、利用結構體指針偏移獲取數(shù)據(jù))

    記錄問題,還沒有研究明白 最后一部分的偏移還在找規(guī)律 打印字符數(shù)組每個字節(jié)的地址

    2024年02月10日
    瀏覽(20)
  • 數(shù)據(jù)結構——利用堆進行對數(shù)組的排序

    數(shù)據(jù)結構——利用堆進行對數(shù)組的排序

    今天文章的內容是關于我們如何利用堆的特性對我們的數(shù)組進行排序,還有就是我們的TopK的問題,這次我們放在的是文件種,我們放入一億個數(shù)字,然后我們取出一億個數(shù)字中最大的十個數(shù),利用上章堆的問題進行解決。 首先就是我們如果對一個數(shù)組要進行排序,這個數(shù)組

    2024年02月05日
    瀏覽(22)
  • 數(shù)據(jù)結構——利用棧來實現(xiàn)進制轉換

    數(shù)據(jù)結構——利用棧來實現(xiàn)進制轉換

    1. 順序棧實現(xiàn)十進制轉換二進制

    2024年02月06日
    瀏覽(20)
  • 數(shù)據(jù)結構:利用棧實現(xiàn)數(shù)制轉換

    數(shù)據(jù)結構:利用棧實現(xiàn)數(shù)制轉換

    數(shù)制轉換 從鍵盤輸入一個十進制數(shù)n,并輸入要轉換的進制數(shù)m,利用棧將n轉換成m進制,并輸出轉換后的結果。 首先設計一個含有多個菜單項的主菜單程序,然后再為這些菜單項配上相應的功能。 主菜單設計要求: 程序運行后,顯示一個標題“進制轉換”,標題下方給出4個

    2024年02月07日
    瀏覽(29)
  • 利用C++超詳細解釋數(shù)據(jù)結構中的鏈表

    鏈表(Linked List)是一種常見的數(shù)據(jù)結構,它可以動態(tài)地插入和刪除元素,不需要像數(shù)組那樣預先分配固定大小的內存。鏈表中的每個元素稱為節(jié)點(Node),每個節(jié)點包含一個數(shù)據(jù)值和一個指向下一個節(jié)點的指針。本教學將涵蓋以下知識點: 單向鏈表(Singly Linked List) 雙向

    2024年02月04日
    瀏覽(27)
  • 數(shù)據(jù)結構實戰(zhàn):利用JavaScript和Python實現(xiàn)鏈表

    數(shù)據(jù)結構實戰(zhàn):利用JavaScript和Python實現(xiàn)鏈表

    本實戰(zhàn)通過JavaScript和Python兩種編程語言分別實現(xiàn)單鏈表數(shù)據(jù)結構。首先,介紹了鏈表的基本概念,包括結點(包含數(shù)據(jù)域和指針域)和鏈表結構(由多個結點按一定順序鏈接而成)。在JavaScript部分,創(chuàng)建了LinkedList.js文件,定義了Node類和LinkedList類,實現(xiàn)了鏈表的增刪查改等

    2024年02月01日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包