當前位置:編程學習大全網 - 編程語言 - 樹的遍歷,用C的數據結構做。不是二叉樹。是普通的樹。

樹的遍歷,用C的數據結構做。不是二叉樹。是普通的樹。

二叉樹 (binary tree) 是另壹種樹型結構,它的特點是每個結點至多只有二棵子 樹 (即二叉樹中不存在度大於 2的結點 ),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒 . 二叉樹是壹種數據結構 :

Binary_tree=(D,R)

其中: D是具有相同特性的數據元素的集合 ;若 D等於空 ,則 R等於空稱為空的二叉樹 ;若 D等於空則 R是 D上某個二元關系 H的集合,即 R=,且

(1) D 中存在唯壹的稱為根的元素 r,它的關系 H下無前驅 ;

(2) 若 D-不等於空,則 D-=,且 Dl交 Dr等於空 ;

(3) 若 Dl不等於空 ,則在 Dl中存在唯壹的元素 xl,〈 r,xl〉屬於 H,且存在 Dl上的關系 Hl屬於 H; 若 Dr不等於空 ,則在 Dr中存在唯壹的元素 xr,〈 r,xr〉 >屬於 H, 且存 Dr上的關 系 Hr屬於 H; H=;

(4) (Dl, Hl) 是壹棵合本定義的二叉樹,稱為根 r的左子樹 ,(Dr,Hr)是壹棵符合定義的二叉樹,稱為根的右子樹。

其中,圖 6.2 是各種形態的二叉樹 .

(1) 為空二叉樹 (2)只有壹個根結點的二叉樹 (3)右子樹為空的二叉樹 (4)左子樹為空的二叉樹 (5)完全二叉樹

二叉樹的基本操作:

(1)INITIATE(BT ) 初始化操作。置 BT為空樹。

(2)ROOT(BT)\ROOT(x) 求根函數。求二叉樹 BT的根結點或求結點 x所在二叉樹的根結點。

若 BT是空樹或 x不在任何二叉樹上,則函數值為 “空 ”。

(3)PARENT(BT,x) 求雙親函數。求二叉樹 BT中結點 x的雙親結點。若結點 x是二叉樹 BT 的根結點

或二叉樹 BT中無 x結點,則函數值為 “空 ”。

(4)LCHILD(BT,x) 和 RCHILD(BT,x) 求孩子結點函數。分別求二叉樹 BT中結點 x的左孩 子和右孩子結點。

若結點 x為葉子結點或不在二叉樹 BT中,則函數值為 “空 ”。

(5)LSIBLING(BT,x) 和 RSIBING(BT,x) 求兄弟函數。分別求二叉樹 BT中結點 x的左兄弟和右兄弟結點。

若結點 x是根結點或不在 BT中或是其雙親的左 /右子樹根 ,則函樹值 為 “空 ”。

(6)CRT_BT(x,LBT,RBT) 建樹操作。生成壹棵以結點 x為根,二叉樹 LBT和 RBT分別為左, 右子樹的二叉樹。

(7)INS_LCHILD(BT,y,x) 和 INS_RCHILD(BT,x) 插入子樹操作。將以結點 x為根且右子樹為空的二叉樹

分別置為二叉樹 BT中結點 y的左子樹和右子樹。若結點 y有左子樹 /右子樹,則插入後是結點 x的右子樹。

(8)DEL_LCHILD(BT,x) 和 DEL-RCHILD(BT,x) 刪除子樹操作。分別刪除二叉樹 BT中以結點 x為根的左子樹或右子樹。

若 x無左子樹或右子樹,則空操作。

(9)TRAVERSE(BT) 遍歷操作。按某個次序依此訪問二叉樹中各個結點,並使每個結點只被訪問壹次。

(10)CLEAR(BT) 清除結構操作。將二叉樹 BT置為空樹。

5.2.2 二叉樹的存儲結構

壹 、順序存儲結構

連續的存儲單元存儲二叉樹的數據元素。例如圖 6.4(b)的完全二叉樹 , 可以向量 (壹維數組 ) bt(1:6)作它的存儲結構,將二叉樹中編號為 i的結點的數據元素存放在分量 bt[i]中 ,如圖 6.6(a) 所示。但這種順序存儲結構僅適合於完全二叉樹 ,而壹般二叉樹也按這種形式來存儲 ,這將造成存 貯浪費。如和圖 6.4(c)的二叉樹相應的存儲結構圖 6.6(b)所示,圖中以 “0”表示不存在此結點 .

二、 鏈式存儲結構

由二叉樹的定義得知二叉樹的結點由壹個數據元素和分別指向左右子樹的兩個分支構成 ,則表 示二叉樹的鏈表中的結點至少包含三個域 :數據域和左右指針域 ,如圖 (b)所示。有時 ,為了便於找 到結點的雙親 ,則還可在結點結構中增加壹個指向其雙親受的指針域,如圖 6.7(c)所示。

5.3 遍歷二叉樹

遍歷二叉樹 (traversing binary tree)的問題, 即如何按某條搜索路徑巡訪樹中每個結點,使得每個結點均被訪問壹次,而且僅被訪問壹次。 其中常見的有三種情況:分別稱之為先 (根 )序遍歷,中 (根 )序遍歷和後 (根 )序遍歷。

5.3.1 前序遍歷

前序遍歷運算:即先訪問根結點,再前序遍歷左子樹,最後再前序遍歷右子樹。前序遍歷運算訪問二叉樹各結點是以根、左、右的順序進行訪問的。例如:

按前序遍歷此二叉樹的結果為: Hello!How are you?

proc preorder(bt:bitreprtr)

if (bt<>null)[

print(bt^);

preorder(bt^.lchild);

preorder(bt^.rchild);]

end;

5.3.2 中序遍歷

中序遍歷運算:即先中前序遍歷左子樹,然後再訪問根結點,最後再中序遍歷右子樹。中序遍歷運算訪問二叉樹各結點是以左、根、右的順序進行訪問的。例如:

按中序遍歷此二叉樹的結果為: a*b-c

proc inorder(bt:bitreprtr)

if (bt<>null)[

inorder(bt^.lchild);

print(bt^);

niorder(bt^.rchild);]

end;

5.3.3 後序遍歷

後序遍歷運算:即先後序遍歷左子樹,然後再後序遍歷右子樹,最後訪問根結點。後序遍歷運算訪問二叉樹各結點是以左、右、根的順序進行訪問的。例如:

按後序遍歷此二叉樹的結果為: Welecome to use it!

proc postorder(bt:bitreprtr)

if (bt<>null)[

postorder(bt^.lchild);

postorder(bt^.rchild);]

print(bt^);

end;

五、例:

1.用順序存儲方式建立壹棵有31個結點的滿二叉樹,並對其進行先序遍歷。

2.用鏈表存儲方式建立壹棵如圖三、4所示的二叉樹,並對其進行先序遍歷。

3.給出壹組數據:R=,試編程序,先構造壹棵二叉樹,然後以中序遍歷訪問所得到的二叉樹,並輸出遍歷結果。

4.給出八枚金幣a,b,c,d,e,f,g,h,編程以稱最少的次數,判定它們蹭是否有假幣,如果有,請找出這枚假幣,並判定這枚假幣是重了還是輕了。

中山紀念中學三鑫雙語學校信息學競賽組編寫 2004.7.15

  • 上一篇:VR是什麽的簡稱
  • 下一篇:以太坊智能合約是什麽
  • copyright 2024編程學習大全網