Ⅰ 二叉樹實際應用場景有哪些
紅黑二叉樹(比MD5可是快多了) - .NET HASH表
STL HASH表
樹 - 文件系統,
huffman編碼- JPEG圖象格式做成(主要用於壓縮)這個應用夠大了吧
還可以用於加密之類的
其他的不了解 可以查查其他的資料
Ⅱ 數據結構樹和二叉樹的實際應用
數據結構樹和二叉樹的實際應用:哈夫曼編碼。
利用哈夫曼編碼進行通信可以大大提高信道的利用率,縮簡訊息傳輸的時間,降低傳輸成本。根據哈夫曼編碼的原理,編寫一個程序,在用戶輸入結點權值的基礎上求哈夫曼編碼。
從鍵盤輸入若干字元及每個字元出現的頻率,將字元出現的頻率作為結點的權值,建立哈夫曼樹,求出各字元的哈夫曼編碼。
要求:輸出存放哈夫曼樹的數組HT的初態和終態;輸出每個字元的哈夫曼編碼;輸入由上述若干字元組成的字元串,對電文進行編碼並輸出;輸入電文的哈夫曼編碼,進行解碼並輸出。
在計算機科學中,樹是用來模擬具有樹狀結構性質的數據集合。它是由n(n>=0)個有限節點組成一個具有層次關系的集合。把它叫做「樹」是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。(n = 0 時稱為空樹)
特點有:每個節點有零個或多個子節點;沒有父節點的節點稱為根節點;每一個非根節點有且只有一個父節點;除了根節點外,每個子節點可以分為多個不相交的子樹。
二叉樹的性質:
二叉樹的第ii層至多擁有2i−12i−1個節點數, ii>=1);
深度為 kk的二叉樹至多總共有 2k−12k−1 個節點數,(kk>=1);
對任何一棵非空的二叉樹TT,如果其葉片(終端節點)數為 n0n0,分支度為22的節點數為 n2n2,則 n0=n2+1。
(2)二叉樹的應用範例擴展閱讀:
樹狀圖由n(n>=0)個有限結點組成一個具有層次關系的集合。把它叫做「樹」是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:
每個結點有零個或多個子結點;沒有父結點的結點稱為根結點;每一個非根結點有且只有一個父結點;除了根結點外,每個子結點可以分為多個不相交的子樹;
單個結點是一棵樹,樹根就是該結點本身。
設T1,T2,..,Tk是樹,它們的根結點分別為n1,n2,..,nk。用一個新結點n作為n1,n2,..,nk的父親,則得到一棵新樹,結點n就是新樹的根。我們稱n1,n2,..,nk為一組兄弟結點,它們都是結點n的子結點。我們還稱T1,T2,..,Tk為結點n的子樹。
空集合也是樹,稱為空樹。空樹中沒有結點。
Ⅲ 二叉樹的應用
一個單位有10個部門,每個部門都有一部電話,但是整個單位只有一根外線,當有電話打過來的時候,由轉接員轉到內線電話,已知各部門使用外線電話的頻率為(次/天)
5 20 10 12 8 4 3 5 6 9
問應該如何設計個內線電話號碼,使得接線員撥號次數盡可能少?
這是哈夫曼樹的應用
Ⅳ 二叉樹是用來干什麼的在軟體工程方面有什麼用途,請幫小弟舉幾個實例。
二叉樹常被用於實現二叉查找樹和二叉堆。
在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」和「右子樹」。
根據不同的用途可分為:
1、完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。
2、滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。
3、平衡二叉樹——平衡二叉樹又被稱為AVL樹(區別於AVL演算法),它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。
(4)二叉樹的應用範例擴展閱讀
深度為h的二叉樹最多有個結點(h>=1),最少有h個結點。對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1。
有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系為若I為結點編號則 如果I>1,則其父結點的編號為I/2。如果2*I<=N,則其左孩子(即左子樹的根結點)的編號為2*I。若2*I>N,則無左孩子。如果2*I+1<=N,則其右孩子的結點編號為2*I+1。
Ⅳ 二叉樹在實際項目中的應用有哪些
實際上,在項目中是有硬性有的,所以說在很多地方都被找到了正規的一些發展地區的方向和它的功能
Ⅵ 求「二叉樹及其應用」的論文
實驗六
二叉樹及其應用(一)
題一:二叉樹採用二叉鏈表結構表示。設計並實現如下演算法:後序遞歸建樹,先序非遞歸遍歷該樹。
題二:二叉樹採用二叉鏈表結構表示。設計並實現如下演算法:輸入某棵二叉樹的廣義表形式,建立該二叉樹,並按層次遍歷該二叉樹。
實驗七
二叉樹及其應用(二)
題一:二叉樹採用二叉鏈表結構表示。設計並實現如下演算法:求一棵二叉樹的深度和雙分支結點的個數。
題二:二叉樹採用二叉鏈表結構表示。設計並實現如下演算法:按輸入的關鍵字序列建立一棵二叉排序樹,並刪除該二叉排序樹上的一個結點。
我們搞NOIP時用pascal做過此類問題
你如果也是用的這個語言的話
可以去下載NOIP的輔導資料來看看
Ⅶ 二叉樹在計算機科學與技術中的應用有哪些
霍夫曼編碼:這是一種數據壓縮方法,利用一棵霍夫曼樹(本質為二叉樹)來壓縮一組數據。
優先順序隊列:它使用一棵二叉樹來記錄集合中元素的優先順序,並將其排序,為解決問題提供更好的方案。
事件調度:主要使用二叉搜索樹,這能夠使得查找信息更加高效。
資料庫系統:主要使用B樹,這能夠使插入和刪除操作更加高效。
用戶界面:在圖形用戶界面中,窗口按樹形結構組織,如windows系統。
文件系統:文件按樹形結構組織,如windows系統。
人工智慧:比如棋類這種邏輯類的游戲,可以把步驟生成決策樹。
以上如果需要詳細了解,可直接網路相關名詞。
Ⅷ 什麼是二叉樹,舉一個二叉樹的例子
樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。樹結構的特點是:它的每一個結點都可以有不止一個直接後繼,除根結點外的所有結點都有且只有一個直接前趨。以下具體地給出樹的定義及樹的數據結構表示。樹是由一個或多個結點組成的有限集合,其中:⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。2.樹的深度——組成該樹各結點的最大層次,如上圖,其深度為4;3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如上圖可寫成如下形式:二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。(1)完全二叉樹——只有最下面的兩層結點度小於2,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹;(2)滿二叉樹——除了葉結點外每一個結點都有左右子女且葉結點都處在最底層的二叉樹,。(1) 在二叉樹中,第i層的結點總數不超過2^(i-1);(2) 深度為h的二叉樹最多有2h-1個結點(h>=1),最少有h個結點;(3) 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,(5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系:若I為結點編號則 如果I<>1,則其父結點的編號為I/2;如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子;如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。(2)鏈表存儲方式,如:5.普通樹轉換成二叉樹:凡是兄弟就用線連起來,然後去掉父親到兒子的連線,只留下父母到其第一個子女的連線。二叉樹很象一株倒懸著的樹,從樹根到大分枝、小分枝、直到葉子把數據聯系起來,這種數據結構就叫做樹結構,簡稱樹。樹中每個分叉點稱為結點,起始結點稱為樹根,任意兩個結點間的連接關系稱為樹枝,結點下面不再有分枝稱為樹葉。結點的前趨結點稱為該結點的"雙親",結點的後趨結點稱為該結點的"子女"或"孩子",同一結點的"子女"之間互稱"兄弟"。二、二叉樹:二叉樹是一種十分重要的樹型結構。它的特點是,樹中的每個結點最多隻有兩棵子樹,即樹中任何結點的度數不得大於2。二叉樹的子樹有左右之分,而且,子樹的左右次序是重要的,即使在只有一棵子樹的情況下,也應分清是左子樹還是右子樹。定義:二叉樹是結點的有限集合,這個集合或是空的,或是由一個根結點和兩棵互不相交的稱之為左子樹和右子樹的二叉樹組成。對滿二叉樹,從第一層的結點(即根)開始,由下而上,由左及右,按順序結點編號,便得到滿二叉樹的一個順序表示。據此編號,完全二叉樹定義如下:一棵具有n個結點,深度為K的二叉樹,當且僅當所有結點對應於深度為K的滿二叉樹中編號由1至n的那些結點時,該二叉樹便是完全二叉樹。圖4是一棵完全二叉樹。遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為一個線性序列來表示。設L、D、R分別表示遍歷左子樹、訪問根結點和遍歷右子樹, 則對一棵二叉樹的遍歷有三種情況:DLR(稱為先根次序遍歷),LDR(稱為中根次序遍歷),LRD (稱為後根次序遍歷)。
Ⅸ 數據結構樹和二叉樹有哪些實際應用
一個單位有10個部門,每個部門都有一部電話,但是整個單位只有一根外線,當有電話打過來的時候,由轉接員轉到內線電話,已知各部門使用外線電話的頻率為(次/天)
5 20 10 12 8 4 3 5 6 9
問應該如何設計個內線電話號碼,使得接線員撥號次數盡可能少?
這是哈夫曼樹的應用。
一種數據結構,用於保存和處理樹狀的數據,如家譜。
應用極為廣泛,因為根據數據結構的理論,任何復雜的樹夠可以轉換為二叉中並進行處理。
二叉樹再排序、查找、大規模數據索引方面有很多很多應用。
二叉樹排序是簡單演算法排序中速度最快的。
樹的一個大類是自平衡二叉搜索樹 (self-balanced BST), 變種特別多:RB 樹是每個節點是紅色或者黑色, 顏色隔代遺傳AVL 樹是每個節點包含平衡因子, 等於左高-右高Splay 樹是每個節點帶個父節點的指針Treap 是每個節點都帶個隨機的 priority number, parent priority >= child priority。
自平衡二叉搜索樹在面試中經常出現, 但做網頁的互聯網碼農卻很少用得上,如果是當 Map 用, 往往還不如直接上哈希表. 如果是當排序用, 不如直接用排序演算法... 不過也有有用的時候, 例如查找一個數字的上下界。
樹的另一個大類是 Trie, 特點是能保證字典序, 存儲詞典的空間壓縮率高, 能做前綴搜索. 在正則匹配, 數據壓縮, 構建索引都可能用到. Trie 也有不少變種:Double Array - trie 的一個經典實現。
每個節點可以存一段字元串而不限於一個字元Judy Array - 基於 256-ary radix tree, 用了 20 種壓縮方式, 極其復雜...Burst Trie - 如果一個子樹足夠小, 就用 binary 堆的方式存儲,。
不過壓縮效果一般HAT Trie - 壓縮率高而且不容易出現 CPU cache miss, 查速接近哈希表而耗內存少得多. 節點可以是以下三種之一: Array Hash, 序列化的 Bucket, 傳統 Trie nodeMARISA Trie - 壓縮率最高, 支持 mmap 載入, 也是用了很多壓縮技巧的復雜實現, 就是構建比較花時間, 也不能動態更新。
Ⅹ C語言 二叉樹的應用,跪求高手。
二叉樹的前序、中序、後序遍歷
#include<malloc.h>
//
malloc()等
#include<stdio.h>
//
標准輸入輸出頭文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h>
//
atoi(),exit()
#include<math.h>
//
數學函數頭文件,包括floor(),ceil(),abs()等
#define
ClearBiTree
DestroyBiTree
//
清空二叉樹和銷毀二叉樹的操作一樣
typedef
struct
BiTNode
{
int
data;
//
結點的值
BiTNode
*lchild,*rchild;
//
左右孩子指針
}BiTNode,*BiTree;
int
Nil=0;
//
設整型以0為空
void
visit(int
e)
{
printf("%d
",e);
//
以整型格式輸出
}
void
InitBiTree(BiTree
&T)
{
//
操作結果:構造空二叉樹T
T=NULL;
}
void
CreateBiTree(BiTree
&T)
{
//
演算法6.4:按先序次序輸入二叉樹中結點的值(可為字元型或整型,在主程中定義),
//
構造二叉鏈表表示的二叉樹T。變數Nil表示空(子)樹。修改
int
number;
scanf("%d",&number);
//
輸入結點的值
if(number==Nil)
//
結點的值為空
T=NULL;
else
//
結點的值不為空
{
T=(BiTree)malloc(sizeof(BiTNode));
//
生成根結點
if(!T)
exit(OVERFLOW);
T->data=number;
//
將值賦給T所指結點
CreateBiTree(T->lchild);
//
遞歸構造左子樹
CreateBiTree(T->rchild);
//
遞歸構造右子樹
}
}
void
DestroyBiTree(BiTree
&T)
{
//
初始條件:二叉樹T存在。操作結果:銷毀二叉樹T
if(T)
//
非空樹
{
DestroyBiTree(T->lchild);
//
遞歸銷毀左子樹,如無左子樹,則不執行任何操作
DestroyBiTree(T->rchild);
//
遞歸銷毀右子樹,如無右子樹,則不執行任何操作
free(T);
//
釋放根結點
T=NULL;
//
空指針賦0
}
}
void
PreOrderTraverse(BiTree
T,void(*Visit)(int))
{
//
初始條件:二叉樹T存在,Visit是對結點操作的應用函數。修改演算法6.1
//
操作結果:先序遞歸遍歷T,對每個結點調用函數Visit一次且僅一次
if(T)
//
T不空
{
Visit(T->data);
//
先訪問根結點
PreOrderTraverse(T->lchild,Visit);
//
再先序遍歷左子樹
PreOrderTraverse(T->rchild,Visit);
//
最後先序遍歷右子樹
}
}
void
InOrderTraverse(BiTree
T,void(*Visit)(int))
{
//
初始條件:二叉樹T存在,Visit是對結點操作的應用函數
//
操作結果:中序遞歸遍歷T,對每個結點調用函數Visit一次且僅一次
if(T)
{
InOrderTraverse(T->lchild,Visit);
//
先中序遍歷左子樹
Visit(T->data);
//
再訪問根結點
InOrderTraverse(T->rchild,Visit);
//
最後中序遍歷右子樹
}
}
void
PostOrderTraverse(BiTree
T,void(*Visit)(int))
{
//
初始條件:二叉樹T存在,Visit是對結點操作的應用函數
//
操作結果:後序遞歸遍歷T,對每個結點調用函數Visit一次且僅一次
if(T)
//
T不空
{
PostOrderTraverse(T->lchild,Visit);
//
先後序遍歷左子樹
PostOrderTraverse(T->rchild,Visit);
//
再後序遍歷右子樹
Visit(T->data);
//
最後訪問根結點
}
}
void
main()
{
BiTree
T;
InitBiTree(T);
//
初始化二叉樹T
printf("按先序次序輸入二叉樹中結點的值,輸入0表示節點為空,輸入範例:1
2
0
0
3
0
0\n");
CreateBiTree(T);
//
建立二叉樹T
printf("先序遞歸遍歷二叉樹:\n");
PreOrderTraverse(T,visit);
//
先序遞歸遍歷二叉樹T
printf("\n中序遞歸遍歷二叉樹:\n");
InOrderTraverse(T,visit);
//
中序遞歸遍歷二叉樹T
printf("\n後序遞歸遍歷二叉樹:\n");
PostOrderTraverse(T,visit);
//
後序遞歸遍歷二叉樹T
}