❶ 二叉樹的後序遍歷是怎樣訪問的還有哪幾類分類啊高手指教~~~
左子樹->右子樹->根(如果子樹不是葉子節點就遞歸這個過程)
其他的還有:
先序遍歷:根->左->右
中序遍歷:左->根->右
❷ 二叉樹的創建與訪問演算法的設計
Node{
Node* left;
Node* right;
int value;
};
void traverse(Node* tree)
{
if( !tree) return;
traverse(tree->left);
traverse(tree->right);
// do something here on tree->value -> e.g.
printf("%d\n", tree->value);
}
Finish entering tree elements by yourself.
❸ 什麼是二叉樹二叉樹拿來干什麼
在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查找樹和二叉堆。二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的(i-1)次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。
樹和二叉樹的2個主要差別:
1. 樹中結點的最大度數沒有限制,而二叉樹結點的最大度數為2;
2. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。……
樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序時,可用樹表示源程序的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。
樹的概述
樹結構的特點是:它的每一個結點都可以有不止一個直接後繼,除根結點外的所有結點都有且只有一個直接前趨。以下具體地給出樹的定義及樹的數據結構表示。
樹的定義
樹是由一個或多個結點組成的有限集合,其中:
⒈必有一個特定的稱為根(ROOT)的結點;
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。
樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹
1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。
2.樹的深度——組成該樹各結點的最大層次,如上圖,其深度為3;
3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;
4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。
樹的表示
樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如上圖可寫成如下形式:
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
二叉樹
1.二叉樹的基本形態
二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:
(1)空二叉樹——(a);
(2)只有一個根結點的二叉樹——(b);
(3)只有左子樹——(c);
(4)只有右子樹——(d);
(5)完全二叉樹——(e)
注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。
2.兩個重要的概念
(1)完全二叉樹——若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的節點都連續集中在最左邊,這就是完全二叉樹。
(2)滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉結點都處在最底層的二叉樹,。
3.二叉樹的性質
(1) 在二叉樹中,第i層的結點總數不超過2^(i-1);
(2) 深度為h的二叉樹最多有2^(h)-1個結點(h>=1),最少有h個結點;
(3) 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,
則N0=N2+1;
(4) 具有n個結點的完全二叉樹的深度為int(log2n)+1
(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,則無右兒子。
(6)給定N個節點,能構成h(N)種不同的二叉樹。
h(N)為卡特蘭數的第N項。h(n)=C(n,2*n)/(n+1)。
4.二叉樹的存儲結構
(1)順序存儲方式
type node=record
data:datatype
l,r:integer;
end;
var tr:array[1..n] of node;
(2)鏈表存儲方式,如:
type btree=^node;
node=record
data:datatye;
lchild,rchild:btree;
end;
5.普通樹轉換成二叉樹
二叉樹很象一株倒懸著的樹,從樹根到大分枝、小分枝、直到葉子把數據聯系起來,這種數據結構就叫做樹結構,簡稱樹。樹中每個分叉點稱為結點,起始結點稱為樹根,任意兩個結點間的連接關系稱為樹枝,結點下面不再有分枝稱為樹葉。結點的前趨結點稱為該結點的"雙親",結點的後趨結點稱為該結點的"子女"或"孩子",同一結點的"子女"之間互稱"兄弟"。
普通樹轉二叉樹,一般採用左「子女」右「兄弟」的方式來轉化。
完全二叉樹
對滿二叉樹,從第一層的結點(即根)開始,由下而上,由左及右,按順序結點編號,便得到滿二叉樹的一個順序表示。據此編號,完全二叉樹定義如下:一棵具有n個結點,深度為K的二叉樹,當且僅當所有結點對應於深度為K的滿二叉樹中編號由1至n的那些結點時,該二叉樹便是完全二叉樹。圖4是一棵完全二叉樹。
二叉樹遍歷
遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為一個線性序列來表示。
設L、D、R分別表示遍歷左子樹、訪問根結點和遍歷右子樹, 則對一棵二叉樹的遍歷有三種情況:DLR(稱為先根次序遍歷),LDR(稱為中根次序遍歷),LRD (稱為後根次序遍歷)。
(1)前序遍歷
訪問根;按前序遍歷左子樹;按前序遍歷右子樹
(2)中序遍歷
按中序遍歷左子樹;訪問根;按中序遍歷右子樹
(3)後序遍歷
按後序遍歷左子樹;按後序遍歷右子樹;訪問根
(4)層次遍歷
即按照層次訪問,通常用隊列來做。訪問根,訪問子女,再訪問子女的子女(越往後的層次越低)(兩個子女的級別相同)
特殊的二叉樹
1. 完全二叉樹
Complete Binary Tree
若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層從右向左連續缺若干結點,這就是完全二叉樹。
2. 滿二叉樹
Full Binary Tree:
一個高度為h的二叉樹包含正是2-1元素稱為滿二叉樹。
❹ 二叉樹運算的三種遍歷運算
先訪問根結點,再訪問左子樹,最後訪問右子樹的次序訪問二叉樹中所有的結點,且每個結點僅訪問一次.
void preorder(btree *p)
{
if(p!=NULL)
{ printf(%d,p->data);
preorder(p->left);
preorder(p->right);
}
} 先訪問左子樹,再訪問根結點,最後訪問右子樹的次序訪問二叉樹的所有結點,且每個結點僅訪問一次.
void inorder(btree *p)
{
if(p!=NULL)
{ inorder(p->left);
printf(%d,p->data);
inorder(p->right);
}
} 先訪問左子樹,再訪問右子樹,最後訪問根結點的次序訪問二叉樹中所有的結點,且每個結點僅訪問一次
void postorder(btree *p)
{
if(p!=NULL)
{ postorder(p->left);
postorder(p->right);
printf(%d,p->data);
}
}