請用非遞迴方式實現二叉樹的先序、中序和後序的遍歷列印。
給定乙個二叉樹的根結點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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...