非遞迴二叉樹的遍歷列印

2021-09-02 16:37:08 字數 1825 閱讀 3577

請用非遞迴方式實現二叉樹的先序、中序和後序的遍歷列印。

給定乙個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷(二維陣列的形式)。

先序

先序遍歷的規則:根 左 右

先序遍歷的結果:1 2 4 5 3 6 7

舉例說明:

1、節點1入棧,彈出、列印;

2、將彈出的節點1的右孩子3先入棧,左孩子2後入棧;

3、2出棧,2的右、左孩子依次入棧

4、重複上述步驟,保證:彈出節點右孩子先入棧,左孩子再入棧,直至棧空

中序

中序遍歷的規則: 左 根 右

中序遍歷的結果:4 2 5 1 6 3 7

舉例說明:

1、節點1、2、4依次入棧;

2、當節點4的左孩子為空時,節點4出棧,cur指標指向彈出節點4;

3、當節點4的右孩子為空時,節點2繼續出棧,cur指向2;

當節點2的右孩子不為空時,節點5進棧,cur指向節點5;

4、 重複2,3;

後序

後序遍歷的規則: 左 右 根

後序遍歷的結果:4 5 2 6 7 3 1

舉例說明:

1、節點1入棧,彈出並列印;

2、節點1的左節點存在,節點2入棧;

節點1的右節點存在,節點3入棧;

3、棧頂節點3彈出,3的左右節點入棧;

。。。將棧1彈出的所有節點一次入棧2;棧2依次彈出的節點為最後的結果。

/*

struct treenode

};*/

class treetosequence

void

first

(treenode* node,stack

>

&stk,vector<

int>

&array)

if(cur->left)}}

void

middle

(treenode* node,stack

>

&stk,vector<

int>

&array)

else}}

// 使用2個棧實現,stk 和 stk1

void

last

(treenode* node,stack

>

&stk,vector<

int>

&array)

if(cur->right)

}while

(!stk1.

empty()

)}};

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...