c c 常用演算法 5

2021-12-29 23:05:48 字數 3953 閱讀 4820

1.樹的定義

樹(tree)是n(n≧0)個結點的有限集合t,若n=0時稱為空樹,否則:

⑴ 有且只有乙個特殊的稱為樹的根(root)結點;

⑵ 若n>1時,其餘的結點被分為m(m>0)個互不相交的子集t1, t2, t3…tm,其中每個子集本身又是一棵樹,稱其為根的子樹(subtree)。

這是樹的遞迴定義,即用樹來定義樹,而只有乙個結點的樹必定僅由根組成,如圖6-1(a)所示。

2樹的基本術語

⑴ 結點(node):乙個資料元素及其若干指向其子樹的分支。

⑵ 結點的度(degree)、樹的度:結點所擁有的子樹的棵數稱為結點的度。樹中結點度的最大值稱為樹的度。

如圖6-1(b)中結點a的度是3,結點b的度是2,結點m的度是0,樹的度是3 。

⑶ 葉子(left)結點、非葉子結點:樹中度為0的結點稱為葉子結點(或終端結點)。相對應地,度不為0的結點稱為非葉子結點(或非終端結點或分支結點)。除根結點外,分支結點又稱為內部結點。

如圖6-1(b)中結點h、i、j、k、l、m、n是葉子結點,而所有其它結點都是分支結點。

⑷ 孩子結點、雙親結點、兄弟結點

乙個結點的子樹的根稱為該結點的孩子結點(child)或子結點;相應地,該結點是其孩子結點的雙親結點(parent)或父結點。

如圖6-1(b)中結點b、c、d是結點a的子結點,而結點a是結點b、c、d的父結點;類似地結點e、f是結點b的子結點,結點b是結點e、f的父結點。

同一雙親結點的所有子結點互稱為兄弟結點。

如圖6-1(b)中結點b 、c、d是兄弟結點;結點e、f是兄弟結點。

⑸ 層次、堂兄弟結點

規定樹中根結點的層次為1,其餘結點的層次等於其雙親結點的層次加1。

若某結點在第l(l≧1)層,則其子結點在第l+1層。

雙親結點在同一層上的所有結點互稱為堂兄弟結點。如圖6-1(b)中結點e、f、g、h、i、j。

⑹ 結點的層次路徑、祖先、子孫

從根結點開始,到達某結點p所經過的所有結點成為結點p的層次路徑(有且只有一條)。

結點p的層次路徑上的所有結點(p除外)稱為p的祖先(ancester)。

以某一結點為根的子樹中的任意結點稱為該結點的子孫結點(descent)。

⑺樹的深度(depth):樹中結點的最大層次值,又稱為樹的高度,如圖6-1(b)中樹的高度為4。

⑻ 有序樹和無序樹:對於一棵樹,若其中每乙個結點的子樹(若有)具有一定的次序,則該樹稱為有序樹,否則稱為無序樹。

⑼森林(forest):是m(m≧0)棵互不相交的樹的集合。顯然,若將一棵樹的根結點刪除,剩餘的子樹就構成了森林。

3 樹的表示形式

⑴ 倒懸樹。是最常用的表示形式,如圖6-1(b)。

⑵ 巢狀集合。是一些集合的集體,對於任何兩個集合,或者不相交,或者乙個集合包含另乙個集合。圖6-2(a)是圖6-1(b)樹的巢狀集合形式。

⑶ 廣義表形式。圖6-2(b)是樹的廣義表形式。

⑷ 凹入法表示形式。

樹的表示方法的多樣化說明了樹結構的重要性。

1 二叉樹的定義

二叉樹(binarytree)是n(n≥0)個結點的有限集合。若n=0時稱為空樹,否則:

⑴有且只有乙個特殊的稱為樹的根(root)結點;

⑵若n>1時,其餘的結點被分成為二個互不相交的子集t1,t2,分別稱之為左、右子樹,並且左、右子樹又都是二叉樹。

由此可知,二叉樹的定義是遞迴的。

二叉樹在樹結構中起著非常重要的作用。因為二叉樹結構簡單,儲存效率高,樹的操作演算法相對簡單,且任何樹都很容易轉化成二叉樹結構。上節中引入的有關樹的術語也都適用於二叉樹。

2.二叉樹的基本形態

二叉樹有5種基本形態,如圖6-3所示

滿二叉樹的特點:

◆ 基本特點是每一層上的結點數總是最大結點數。

◆ 滿二叉樹的所有的支結點都有左、右子樹。

◆ 可對滿二叉樹的結點進行連續編號,若規定從根結點開始,按「自上而下、自左至右」的原則進行。

完全二叉樹(complete binary tree):如果深度為k,由n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1到n的結點一一對應,該二叉樹稱為完全二叉樹。或深度為k的滿二叉樹中編號從1到n的前n個結點構成了一棵深度為k的完全二叉樹。

其中 2k-1 ≦n≦2k-1 。

完全二叉樹是滿二叉樹的一部分,而滿二叉樹是完全二叉樹的特例。

完全二叉樹的特點:

若完全二叉樹的深度為k ,則所有的葉子結點都出現在第k層或k-1層。對於任一結點,如果其右子樹的最大層次為l,則其左子樹的最大層次為l或l+1。

tree.h

#pragma once

#include

#include

#include "stdio.h"

#include

using namespace std;

#define manlen 20

typedef char data;

typedef struct cbt //定義二叉樹的資料結構

cbttype;

class tree

;tree.cpp

#include "queue.h"

#include

cbttype *tree::inittree()

else

}return null;

}void tree::addtreenode(cbttype *treenode)

else if(ptr =treefindnode(treenode->right, data))

else

} }}cbttype *tree::treeleftnode(cbttype *treenode)

else }

cbttype *tree::treerightnode(cbttype *treenode)

else }

int tree::treeisempty(cbttype *treenode)

else }

int tree::treedepth(cbttype *treenode)

else

else

}}void tree::cleartree(cbttype *treenode)

}void tree::treenodedata(cbttype *p)

if (p->right != null)

}}void tree::dlrtree(cbttype *treenode, void (*treenodedata)(cbttype *p))

}void tree::ldrtree(cbttype *treenode, void (*treenodedata)(cbttype *))

}void tree::lrdtree(cbttype *treenode, void (*treenodedata)(cbttype *))

}main.cpp

#include

using namespace std;

#include "tree.h"

#include

#include

using namespace std;

void treenodedata2(cbttype *p)

int main()

演示效果圖:

參考書籍:《c/c++常用演算法手冊》 《資料結構-清華大學嚴蔚敏》

學習 C C 常用演算法

借用記憶體複製函式memcpy,整體賦值 void memcpy void dst,void src,zize t size 這個函式的功能是將src上,大小為size位元組的資料賦值到dst上。呼叫該寒素需要引用標頭檔案 cstring int arr1 5 int arr2 10 memcpy ...

C C 程式設計常用演算法 貪婪法

文件宣告 以下資料均屬於本人在學習過程中產出的學習筆記,如果錯誤或者遺漏之處,請多多指正。並且該文件在後期會隨著學習的深入不斷補充完善。程式設計的關鍵就是演算法,演算法簡單來說就是程式設計時問題解題步驟或者資料資料的流程。這裡我們將介紹以下幾種常用的演算法 迭代法 窮舉法 遞推法 遞迴發 回溯法 貪...

常用演算法程式集(c c )筆記(一)

一 一維多項式求值 書本中是採用c編寫的 在此修改為c 並在visual studio 2017 community 下除錯程式 plvy.c程式 include stdafx.h visual studio 2017中的標頭檔案 include stdio.h double plyv double...