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...