1樓:匿名使用者
這是noi的教材的,我也沒花多少時間去看。我先複製給你吧。
二叉樹的遍歷
在二叉樹的應用中,常常要求在樹中查詢具有某種特徵的結點,或者對全部結點逐一進行某種處理,這就是二叉樹的遍歷問題。所謂二叉樹的遍歷是指按一定的規律和次序訪問樹中的各個結點,而且每個結點僅被訪問一次。「訪問」的含義很廣,可以是對結點作各種處理,如輸出結點的資訊等。
遍歷方法共有3種:先序(根)遍歷,中序(根)遍歷,後序(根)遍歷。下面以圖10所示的二叉樹為例分別講解這3種方法。
圖101.先序遍歷的操作定義如下:
若二叉樹為空,則空操作,否則
① 訪問根結點
② 先序遍歷左子樹
③ 先序遍歷右子樹
很明顯,這是一種遞迴定義,下面給出一種手工方法(括號法)求先序遍歷的結果。
==,}=,},,}}
=,{},5},,6,,}}
=2.中序遍歷的操作定義如下:
若二叉樹為空,則空操作,否則
① 中序遍歷左子樹
② 訪問根結點
③ 中序遍歷右子樹
可以根據以上方法,得出上圖中序遍歷的結果為:
3.後序遍歷的操作定義如下:
若二叉樹為空,則空操作,否則
① 後序遍歷左子樹
② 後序遍歷右子樹
③ 訪問根結點
可以根據以上方法,得出上圖後序遍歷的結果為:
顯然,以上3種遍歷方法都是採用遞迴的思想,下面以先序遍歷為例給出遞迴演算法:
procedure preorder(bt:tree);
begin
if bt<>nil then begin
write(bt^.data);
preorder(bt^.lchild);
preorder(bt^.rchild);
end;
end;
我們也可以把遞迴過程改成用棧實現的非遞迴過程,下面給出先序遍歷的非遞迴過程。
procedure inorder(bt:tree);
var stack:array[1..n] of tree;
top:integer;
p:tree;
begin
top:=0;
while not ((bt=nil)and(top=0)) do
begin
while bt<>nil do begin
write(bt^.data);
top:=top+1;
stack[top]:=bt^.rchild;
bt:=bt^.lchild;
end;
if top<>0 then begin
b:=stack[top];top:=top-1;
end;
end;
end;
關於前面講的表示式樹,我們可以分別用先序、中序、後
序的遍歷方法得出完全不同的遍歷結果,對於圖11採用三種遍歷後的結果如下,它們正好對應著表示式的三種表示方法:
-+a*b-cd/ef (字首表示、波蘭式)
a+b*c-d-e/f (中綴表示、代數式)
abcd-*+ef/- (字尾表示、逆波蘭式)
2樓:匿名使用者
請問你的二叉樹是怎麼輸入的,中序先序還是後序輸入?還是高階資料結構?還是完全二叉樹層次遍歷?請說得清楚點啊
什麼是《平衡二叉樹》,平衡二叉樹定義
形態勻稱的二叉樹稱為平衡二叉樹 balanced binary tree 其嚴格定義是 一棵空樹是平衡二叉樹 若 t是一棵非空二叉樹,其左 右子樹為tl和 tr,令hl和 hr分別為左 右子樹的深度。當且僅當 tl tr都是平衡二叉樹 hl hr 1 時,則 t是平衡二叉樹。我覺得平衡二叉樹,不一定...
某二叉樹的中序遍歷為CBADE,後序遍歷序列為CBEDA,則前序遍歷序列為
某二叉樹的中序遍歷為cbade,後序遍歷序列為cbeda,則前序遍歷序列為abcde。中序遍歷 訪問根節點在左右子樹之間,即左 根 右。後序遍歷 訪問根結點在源左右子樹之後,即左 右 根。由定義可以知道 後序遍歷中最後一個就是樹根結點,即a結點。中序遍歷的根節點前面的節點均為左子樹的節點,所以左子樹...
C語言中 二叉樹的順序儲存結構和二叉連結串列,三叉連結串列儲存結構各
鏈式結構優點bai都是便 du於定址,二叉連結串列缺點zhi結構性開銷隨著數dao據結構的回規模變大而答變大 尤其是葉子節點都有2個null,即損失2 sizeof elemtype 線性結構優點沒有結構性開銷,缺點個人感覺是插入和刪除不夠方便?試用場合估計取決問題規模大小,即空間複雜度和時間複雜度...