欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言近萬(wàn)字為你講透樹(shù)與二叉樹(shù)

 更新時(shí)間:2022年05月26日 09:50:22   作者:披星戴月的賈維斯  
樹(shù)是計(jì)算機(jī)算法最重要的非線性結(jié)構(gòu)。因?yàn)闃?shù)能很好地描述結(jié)構(gòu)的分支關(guān)系和層次特性,所以在計(jì)算機(jī)科學(xué)和計(jì)算機(jī)應(yīng)用領(lǐng)域有著廣泛的應(yīng)用。這篇文章我就帶大家一起了解一下樹(shù)、二叉樹(shù)這種結(jié)構(gòu),下篇文章會(huì)重點(diǎn)向大家介紹二叉樹(shù)的遍歷算法

一、樹(shù)概念及結(jié)構(gòu)

1.1 樹(shù)的概念

樹(shù)是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹(shù)是因 為它看起來(lái)像一棵倒掛的樹(shù),也就是說(shuō)它是根朝上,而葉朝下的。

·有一個(gè)特殊的結(jié)點(diǎn),稱為根結(jié)點(diǎn),根節(jié)點(diǎn)沒(méi)有前驅(qū)結(jié)點(diǎn)

·除根節(jié)點(diǎn)外,其余結(jié)點(diǎn)被分成M(M>0)個(gè)互不相交的集合T1、T2、……、Tm,其中每一個(gè)集合Ti(1<= i <= m)又是一棵結(jié)構(gòu)與樹(shù)類(lèi)似的子樹(shù)。

·每棵子樹(shù)的根結(jié)點(diǎn)有且只有一個(gè)前驅(qū),可以有0個(gè)或多個(gè)后繼 因此,樹(shù)是遞歸定義的。

注意:樹(shù)形結(jié)構(gòu)中,子樹(shù)之間不能有交集,否則就不是樹(shù)形結(jié)構(gòu)

1.2 樹(shù)的相關(guān)概念

節(jié)點(diǎn)的度:一個(gè)節(jié)點(diǎn)含有的子樹(shù)的個(gè)數(shù)稱為該節(jié)點(diǎn)的度; 如上圖:A的為6

葉節(jié)點(diǎn)或終端節(jié)點(diǎn):度為0的節(jié)點(diǎn)稱為葉節(jié)點(diǎn); 如上圖:B、C、H、I...等節(jié)點(diǎn)為葉節(jié)點(diǎn)

非終端節(jié)點(diǎn)或分支節(jié)點(diǎn):度不為0的節(jié)點(diǎn); 如上圖:D、E、F、G...等節(jié)點(diǎn)為分支節(jié)點(diǎn)

雙親節(jié)點(diǎn)或父節(jié)點(diǎn):若一個(gè)節(jié)點(diǎn)含有子節(jié)點(diǎn),則這個(gè)節(jié)點(diǎn)稱為其子節(jié)點(diǎn)的父節(jié)點(diǎn); 如上圖:A是B的父節(jié)點(diǎn)

孩子節(jié)點(diǎn)或子節(jié)點(diǎn):一個(gè)節(jié)點(diǎn)含有的子樹(shù)的根節(jié)點(diǎn)稱為該節(jié)點(diǎn)的子節(jié)點(diǎn); 如上圖:B是A的孩子節(jié)點(diǎn)

兄弟節(jié)點(diǎn):具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)互稱為兄弟節(jié)點(diǎn); 如上圖:B、C是兄弟節(jié)點(diǎn)

樹(shù)的度:一棵樹(shù)中,最大的節(jié)點(diǎn)的度稱為樹(shù)的度; 如上圖:樹(shù)的度為6

節(jié)點(diǎn)的層次:從根開(kāi)始定義起,根為第1層,根的子節(jié)點(diǎn)為第2層,以此類(lèi)推;

樹(shù)的高度或深度:樹(shù)中節(jié)點(diǎn)的最大層次; 如上圖:樹(shù)的高度為4

堂兄弟節(jié)點(diǎn):雙親在同一層的節(jié)點(diǎn)互為堂兄弟;如上圖:H、I互為兄弟節(jié)點(diǎn)

節(jié)點(diǎn)的祖先:從根到該節(jié)點(diǎn)所經(jīng)分支上的所有節(jié)點(diǎn);如上圖:A是所有節(jié)點(diǎn)的祖先

子孫:以某節(jié)點(diǎn)為根的子樹(shù)中任一節(jié)點(diǎn)都稱為該節(jié)點(diǎn)的子孫。如上圖:所有節(jié)點(diǎn)都是A的子孫

森林:由m(m>0)棵互不相交的樹(shù)的集合稱為森林;

1.3 樹(shù)的表示

樹(shù)結(jié)構(gòu)相對(duì)線性表就比較復(fù)雜了,要存儲(chǔ)表示起來(lái)就比較麻煩了,既然保存值域,也要保存結(jié)點(diǎn)和結(jié)點(diǎn)之間 的關(guān)系,實(shí)際中樹(shù)有很多種表示方式如:雙親表示法,孩子表示法、孩子雙親表示法以及孩子兄弟表示法 等。我們這里就簡(jiǎn)單的了解其中最常用的孩子兄弟表示法。

如下圖所示:

二、二叉樹(shù)概念及結(jié)構(gòu)

2.1 概念

什么是二叉樹(shù)?簡(jiǎn)言之一棵二叉樹(shù)是結(jié)點(diǎn)的一個(gè)有限集合,該集合:

1. 或者為空

2. 由一個(gè)根節(jié)點(diǎn)加上兩棵別稱為左子樹(shù)和右子樹(shù)的二叉樹(shù)組成

如下圖示

從上圖我們可以看出二叉樹(shù)的兩個(gè)特點(diǎn)

1. 二叉樹(shù)不存在度大于2的結(jié)點(diǎn)

2. 二叉樹(shù)的子樹(shù)有左右之分,次序不能顛倒,因此二叉樹(shù)是有序樹(shù)

注意:對(duì)于任意的二叉樹(shù)都是由以下幾種情況復(fù)合而成的:

2.2 特殊的二叉樹(shù):

1. 滿二叉樹(shù):一個(gè)二叉樹(shù),如果每一個(gè)層的結(jié)點(diǎn)數(shù)都達(dá)到最大值,則這個(gè)二叉樹(shù)就是滿二叉樹(shù)。也就是 說(shuō),如果一個(gè)二叉樹(shù)的層數(shù)為K,且結(jié)點(diǎn)總數(shù)是 ,則它就是滿二叉樹(shù)。

2. 完全二叉樹(shù):完全二叉樹(shù)是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹(shù)是由滿二叉樹(shù)而引出來(lái)的。對(duì)于深度為K 的,有n個(gè)結(jié)點(diǎn)的二叉樹(shù),當(dāng)且僅當(dāng)其每一個(gè)結(jié)點(diǎn)都與深度為K的滿二叉樹(shù)中編號(hào)從1至n的結(jié)點(diǎn)一一對(duì) 應(yīng)時(shí)稱之為完全二叉樹(shù)。 要注意的是滿二叉樹(shù)是一種特殊的完全二叉樹(shù)。

2.3 二叉樹(shù)的性質(zhì)

1. 若規(guī)定根節(jié)點(diǎn)的層數(shù)為1,則一棵非空二叉樹(shù)的第i層上最多有 2^(i - 1)個(gè)結(jié)點(diǎn).

2. 若規(guī)定根節(jié)點(diǎn)的層數(shù)為1,則深度為h的二叉樹(shù)的最大結(jié)點(diǎn)數(shù)是2^h - 1.

3. 對(duì)任何一棵二叉樹(shù), 如果度為0其葉結(jié)點(diǎn)個(gè)數(shù)為n0 , 度為2的分支結(jié)點(diǎn)個(gè)數(shù)為n1 ,則有n0 =n2 +1.

4. 若規(guī)定根節(jié)點(diǎn)的層數(shù)為1,具有n個(gè)結(jié)點(diǎn)的滿二叉樹(shù)的深度,h=log2(n + 1) (是log以2 為底,n+1為對(duì)數(shù))

5. 對(duì)于具有n個(gè)結(jié)點(diǎn)的完全二叉樹(shù),如果按照從上至下從左至右的數(shù)組順序?qū)λ泄?jié)點(diǎn)從0開(kāi)始編號(hào),則對(duì) 于序號(hào)為i的結(jié)點(diǎn)有:

1. 若i>0,i位置節(jié)點(diǎn)的雙親序號(hào):(i-1)/2;i=0,i為根節(jié)點(diǎn)編號(hào),無(wú)雙親節(jié)點(diǎn).

2.若2i+1<n, 左孩子序號(hào);如果2i + 1 >=n 無(wú)左孩子

3. 若2i+2<n, 右孩子序號(hào);如果2i + 1 >=n 無(wú)右孩子

解釋:二叉樹(shù)存儲(chǔ)下標(biāo)從0開(kāi)始就會(huì)出現(xiàn)這種結(jié)果

2.4 二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)

1. 順序存儲(chǔ)

順序結(jié)構(gòu)存儲(chǔ)就是使用數(shù)組來(lái)存儲(chǔ),一般使用數(shù)組只適合表示完全二叉樹(shù),因?yàn)椴皇峭耆鏄?shù)會(huì)有空 間的浪費(fèi)。而現(xiàn)實(shí)中使用中只有堆才會(huì)使用數(shù)組來(lái)存儲(chǔ),關(guān)于堆我們后面的章節(jié)會(huì)專門(mén)講解。二叉樹(shù)順 序存儲(chǔ)在物理上是一個(gè)數(shù)組,在邏輯上是一顆二叉樹(shù)。

2. 鏈?zhǔn)酱鎯?chǔ)

二叉樹(shù)的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)是指,用鏈表來(lái)表示一棵二叉樹(shù),即用鏈來(lái)指示元素的邏輯關(guān)系。 通常的方法是 鏈表中每個(gè)結(jié)點(diǎn)由三個(gè)域組成,數(shù)據(jù)域和左右指針域,左右指針?lè)謩e用來(lái)給出該結(jié)點(diǎn)左孩子和右孩子所 在的鏈結(jié)點(diǎn)的存儲(chǔ)地址 。鏈?zhǔn)浇Y(jié)構(gòu)又分為二叉鏈和三叉鏈,當(dāng)前我們學(xué)習(xí)中一般都是二叉鏈,后面課程 學(xué)到高階數(shù)據(jù)結(jié)構(gòu)如紅黑樹(shù)等會(huì)用到三叉鏈。

三、實(shí)現(xiàn)完全二叉樹(shù)堆并實(shí)現(xiàn)堆排序

3.1 堆的概念和結(jié)構(gòu)

如果有一個(gè)關(guān)鍵碼的集合K = { , , ,…, },把它的所有元素按完全二叉樹(shù)的順序存儲(chǔ)方式存儲(chǔ) 在一個(gè)一維數(shù)組中,并滿足: = 且 >= ) i = 0,1, 2…,則稱為小堆(或大堆)。將根節(jié)點(diǎn)最大的堆叫做最大堆或大根堆,根節(jié)點(diǎn)最小的堆叫做最小堆或小根堆。

堆的性質(zhì): 堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值;

堆總是一棵完全二叉樹(shù)。

3.2 實(shí)現(xiàn)堆的難點(diǎn)

向上調(diào)整算法和向下調(diào)整算法

由于堆是一種非線性存儲(chǔ)結(jié)構(gòu),因此我們?cè)趫?zhí)行堆的刪除時(shí)會(huì)比較復(fù)雜,涉及到向下調(diào)整算法。

原先我們?cè)跅:完?duì)列那講中的挪動(dòng)數(shù)據(jù)覆蓋根的位置的數(shù)據(jù)刪除會(huì)導(dǎo)致堆的結(jié)構(gòu)被破壞了,父子間的結(jié)構(gòu)全亂了。

向下調(diào)整算法的思路:

1、第一個(gè)數(shù)(根位置)和最后一個(gè)位置進(jìn)行交換。

2、刪除最后一個(gè)數(shù)據(jù)。

3、找出左右孩子中小的那個(gè)和父親比較,如果比父親小,交換,再?gòu)慕粨Q的孩子位置繼續(xù)往下調(diào)整。

過(guò)程如下圖所示:

向下調(diào)整算法
void* AdjustDown(HPDataType* a, size_t size, size_t root)
{
       size_t parent = root;
       size_t child = parent * 2 + 1;//默認(rèn)是左孩子
       while (child < size)
       {
              //1、選出左右孩子中小的那個(gè),而且保證不會(huì)越界訪問(wèn)
              if (child + 1 < size && a[child + 1] < a[child])
              {
                      child++;//左孩子變?yōu)橛液⒆?
              }
              if (a[child]< a[parent])
              {
                      Swap(&a[child], &a[parent]);
                      parent = child;//繼續(xù)計(jì)算
                      child = parent * 2 + 1;//默認(rèn)還是計(jì)算左孩子
              }
              else
              {
                      break;
              }
       }
}

為了保持堆的結(jié)構(gòu),我們還要引入向上調(diào)整算法,由于兩種算法原理差不多而且向上調(diào)整比較簡(jiǎn)單易懂,我直接上代碼了。

void Adjustup(HPDataType* a, size_t child)
{
       size_t parent = (child - 1) / 2;
       while (child > 0)
       {
              //小堆a(bǔ)[child] <a[parent],大堆a(bǔ)[child] > a[parent]時(shí)交換
              if (a[child] < a[parent])
              {
                      Swap(&a[child], &a[parent]);//因?yàn)槭侵羔槀鲄?,所以?amp;
                      child = parent;
                      parent = (child - 1) / 2;
              }
              else
              {
                      break;
              }
       }
}

3.3 小堆的實(shí)現(xiàn)

頭文件:

#pragma once
// 小堆
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;
	size_t size;
	size_t capacity;
}HP;
void PrintTopk(int* a, int n, int k);
void HeapInit(HP* php);//堆的初始化
void HeapDestory(HP* php);//堆的銷(xiāo)毀
void Swap(HPDataType* pa, HPDataType* pb);//交換
void HeapPrint(HP* php);
void AdjustDown(HPDataType* a, size_t size, size_t root);//堆的向下調(diào)整算法
//插入x以后,依舊保持堆
void HeapPush(HP* php, HPDataType x);
void Adjustup(HPDataType* a, size_t child);//堆的向上調(diào)整算法
//刪除堆頂?shù)臄?shù)據(jù),(最小/最小)
void HeapPop(HP* php);
bool HeapEmpty(HP* php);
size_t HeapSize(HP* php);
HPDataType HeapTop(HP* php);

源文件:

#include"Heap.h"
void HeapInit(HP* php)
{
	assert(php);
	php->a = NULL;
	php->size = php->capacity = 0;
}
void HeapDestory(HP* php)
{
	assert(php);
	free(php->a);
	php->a = NULL;
	php->size = php->capacity = 0;
}
void Swap(HPDataType* pa, HPDataType* pb)
{
	HPDataType tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
void HeapPrint(HP* php)
{
	assert(php);
	for (size_t i = 0; i < php->size; i++)
	{
		printf("%d ", php->a[i]);
	}
	printf("\n");
}
//涉及堆排序
void Adjustup(HPDataType* a, size_t child)
{
	size_t parent = (child - 1) / 2;
	while (child > 0)
	{
		//小堆a(bǔ)[child] <a[parent],大堆a(bǔ)[child] > a[parent]時(shí)交換
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);//因?yàn)槭侵羔槀鲄ⅲ砸?amp;
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}
void AdjustDown(HPDataType* a, size_t size, size_t root)
{
	size_t parent = root;
	size_t child = parent * 2 + 1;//默認(rèn)是左孩子
	while (child < size)
	{
		//1、選出左右孩子中小的那個(gè),而且保證不會(huì)越界訪問(wèn)
		if (child + 1 < size && a[child + 1] < a[child])//建大堆時(shí)< 改 >
		{
			++child;//左孩子變?yōu)橛液⒆?
		}
		if (a[child] < a[parent])//建大堆時(shí)< 改 >
		{
			Swap(&a[child], &a[parent]);
			parent = child;//繼續(xù)計(jì)算
			child = parent * 2 + 1;//默認(rèn)還是計(jì)算左孩子
		}
		else
		{
			break;
		}
	}
}
void HeapPush(HP* php, HPDataType x)
{
	assert(php);
 
	if (php->size == php->capacity)//滿了,需要擴(kuò)容
	{
		size_t newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;
		//翻譯:新定義一個(gè)無(wú)符號(hào)的newCapacity = 原來(lái)的capacity,如果原來(lái)的capacity = 0, 就賦值為4,4不夠就再*二倍
		HPDataType* tmp = realloc(php->a, sizeof(HPDataType)* newCapacity);
		if (tmp == NULL)
		{
			printf("reallpc failed\n");
			exit(-1); 
		}
		php->a = tmp;
		php->capacity = newCapacity;
	}
	//尾插
	php->a[php->size] = x;
	++php->size;
	//向上調(diào)整保持是一個(gè)小堆
	Adjustup(php->a, php->size - 1);
}
void HeapPop(HP* php)
{
	assert(php);
	assert(php->size > 0);
	Swap(&php->a[0], &php->a[php->size - 1]);
	--php->size;
	AdjustDown(php->a, php->size, 0);
}
bool HeapEmpty(HP* php)
{
	assert(php);
	return php->size == 0;
}
size_t HeapSize(HP* php)
{
	return php->size;
}
HPDataType HeapTop(HP* php)
{
	return php->a[0];
}

3.4 堆的應(yīng)用-堆排序

堆排序即利用堆的思想來(lái)進(jìn)行排序,總共分為兩個(gè)步驟:

1. 建堆

升序:建大堆

降序:建小堆

2. 利用堆刪除思想來(lái)進(jìn)行排序 建堆和堆刪除中都用到了向下調(diào)整,因此掌握了向下調(diào)整,就可以完成堆排序。

代碼示例:

void AdjustDown(HPDataType* a, size_t size, size_t root)
{
       size_t parent = root;
       size_t child = parent * 2 + 1;//默認(rèn)是左孩子
       while (child < size)
       {
              //1、選出左右孩子中小的那個(gè),而且保證不會(huì)越界訪問(wèn)
              if (child + 1 < size && a[child + 1] <a[child])//建大堆時(shí)< 改 >
              {
                      ++child;//左孩子變?yōu)橛液⒆?
              }
              if (a[child] < a[parent])//建大堆時(shí)< 改 >
              {
                      Swap(&a[child], &a[parent]);
                      parent = child;//繼續(xù)計(jì)算
                      child = parent * 2 + 1;//默認(rèn)還是計(jì)算左孩子
              }
              else
              {
                      break;
              }
       }
}
void HeapSort2(int* a, int n)
{
	//向上調(diào)整--建堆
	//for (int i = 1; i < n; ++i)
	//{
	//	AdjustUp(a, i);
	//}
	//向下調(diào)整--建堆O(N)
	for (int i = (n - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(a, n, i);//為什么向下調(diào)整要多傳一個(gè)參數(shù),因?yàn)楫?dāng)child>=size 時(shí)說(shuō)明已經(jīng)到了邊界
	}
	size_t end = n - 1;//n - 1是最后一個(gè)數(shù)據(jù)的下標(biāo)
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		//次大的數(shù)到了倒數(shù)第二個(gè)位置
		--end;
	}
}
int main()
{
//	TestHeap();
	int a[] = { 4 , 2, 7, 8, 5, 1, 0, 6 };
	HeapSort(a, sizeof(a) / sizeof(int));
	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

四.Top-k問(wèn)題

TOP-K問(wèn)題:即求數(shù)據(jù)結(jié)合中前K個(gè)最大的元素或者最小的元素,一般情況下數(shù)據(jù)量都比較大。

比如:專業(yè)前10名、世界500強(qiáng)、富豪榜、游戲中前100的活躍玩家等。

對(duì)于Top-K問(wèn)題,能想到的最簡(jiǎn)單直接的方式就是排序,但是:如果數(shù)據(jù)量非常大,排序就不太可取了(可能 數(shù)據(jù)都不能一下子全部加載到內(nèi)存中)。

最佳的方式就是用堆來(lái)解決,基本思路如下:

1. 用數(shù)據(jù)集合中前K個(gè)元素來(lái)建堆 前k個(gè)最大的元素,則建小堆 前k個(gè)最小的元素,則建大堆 2. 用剩余的N-K個(gè)元素依次與堆頂元素來(lái)比較,不滿足則替換堆頂元素。

將剩余N-K個(gè)元素依次與堆頂元素比完之后,堆中剩余的K個(gè)元素就是所求的前K個(gè)最小或者最大的元素。

因?yàn)镹非常大,k非常小,所以復(fù)雜度相當(dāng)于0(N)

設(shè)置10個(gè)比100萬(wàn)大的數(shù),然后讓電腦隨機(jī)生成數(shù),找出大于100萬(wàn)的10個(gè)數(shù)。

void PrintTopk(int* a, int n, int k)
{
	//1、建堆-- 用a中前k個(gè)元素建堆
	int* kminHeap = (int*)malloc(sizeof(int)* k);
	assert(kminHeap);
	//2、將剩余n-k元素依次與堆頂元素交換,不滿則替換
	for (int i = 0; i < k; i++)
	{
		kminHeap[i] = a[i];//將前k個(gè)數(shù)給給它
	}
	//第k-1個(gè)是最后一位數(shù)的下標(biāo),(k - 1 -1) / 2是倒數(shù)第一個(gè)非葉子結(jié)點(diǎn)
	//建小堆
	for (int j = (k - 1 - 1) / 2; j >= 0; --j)
	{
		AdjustDown(kminHeap, k, j);
	}
	//2、將剩余n - k元素依次與堆頂元素交換,不滿則替換
	for (int i = k; i < n; ++i)
	{
		if (a[i] > kminHeap[0])
		{
			kminHeap[0] = a[i];
			AdjustDown(kminHeap, k, 0);//從根這個(gè)點(diǎn)向下調(diào)
		}
	}
	for (int j = 0; j < k; j++)
	{
		printf("%d ", kminHeap[j]);
	}
	printf("\n");
	free(kminHeap);
}
void TestTopk()
{
	int n = 10000;
	int* a = (int*)malloc(sizeof(int)* n);
	srand(time(0));
	for (size_t i = 0; i < n; ++i)
	{
		a[i] = rand() % 1000000;
	}
	a[5] = 1000000 + 1;
	a[1231] = 1000000 + 2;
	a[531] = 1000000 + 3;
	a[5121] = 1000000 + 4;
	a[115] = 1000000 + 5;
	a[2305] = 1000000 + 6;
	a[99] = 1000000 + 7;
	a[76] = 1000000 + 8;
	a[423] = 1000000 + 9;
	a[0] = 1000000 + 1000;
	PrintTopk(a, n, 10);
}
int main()
{
	TestTopk();
	return 0;
}

總結(jié)

本文近7500字,主要從樹(shù)以及二叉樹(shù)的概念和結(jié)構(gòu)展開(kāi)詳講,再詳細(xì)介紹了堆(特殊的二叉樹(shù))這種數(shù)據(jù)結(jié)構(gòu)的概念、原理以及實(shí)現(xiàn),還有堆的重要應(yīng)用:堆排序以及TOPK問(wèn)題等,希望大家讀后能夠有所收獲。

到此這篇關(guān)于C語(yǔ)言近萬(wàn)字為你講透樹(shù)與二叉樹(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言樹(shù)與二叉樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語(yǔ)言求二叉樹(shù)結(jié)點(diǎn)的最低公共祖先的方法

    使用C語(yǔ)言求二叉樹(shù)結(jié)點(diǎn)的最低公共祖先的方法

    這篇文章主要介紹了使用C語(yǔ)言求二叉樹(shù)結(jié)點(diǎn)的最低公共祖先的方法,文中還給出了ACM的練習(xí)題目,需要的朋友可以參考下
    2015-08-08
  • 使用OpenGL創(chuàng)建窗口的示例詳解

    使用OpenGL創(chuàng)建窗口的示例詳解

    OpenGL,也就是Open?Graphics?Library。其主要就是用于我們?nèi)ヤ秩?D、3D矢量圖形的一種跨語(yǔ)言、跨平臺(tái)的應(yīng)用程序編程接口,這篇文章主要介紹了使用OpenGL創(chuàng)建窗口,需要的朋友可以參考下
    2022-04-04
  • C語(yǔ)言中數(shù)組排序淺析

    C語(yǔ)言中數(shù)組排序淺析

    這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中數(shù)組元素排序的四種類(lèi)型,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-12-12
  • C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表

    C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來(lái)存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)五子棋對(duì)戰(zhàn)系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)五子棋對(duì)戰(zhàn)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)五子棋對(duì)戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言深入探究直接插入排序與希爾排序使用案例講解

    C語(yǔ)言深入探究直接插入排序與希爾排序使用案例講解

    算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語(yǔ)言直接插入排序與希爾排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn)詳解

    C語(yǔ)言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn)詳解

    這篇文章主要介紹了C語(yǔ)言字符串與字符數(shù)組面試題中最易錯(cuò)考點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    C語(yǔ)言 結(jié)構(gòu)體和指針詳解及簡(jiǎn)單示例

    本文主要介紹C語(yǔ)言 結(jié)構(gòu)體和指針,這里整理了相關(guān)資料,并附示例代碼和實(shí)現(xiàn)結(jié)果,以便大家學(xué)習(xí)參考,希望能幫助學(xué)習(xí)C語(yǔ)言的朋友
    2016-08-08
  • VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法

    VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法

    這篇文章主要介紹了VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法,可通過(guò)系統(tǒng)函數(shù)實(shí)現(xiàn)該功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • c語(yǔ)言描述回文數(shù)的三種算法

    c語(yǔ)言描述回文數(shù)的三種算法

    這篇文章主要介紹了c語(yǔ)言描述回文數(shù)的三種算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論