pascal中二叉樹遍歷

2023-01-02 23:50:22 字數 1692 閱讀 4249

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 線性結構優點沒有結構性開銷,缺點個人感覺是插入和刪除不夠方便?試用場合估計取決問題規模大小,即空間複雜度和時間複雜度...