樹的非遞迴遍歷

2021-09-07 13:30:31 字數 1350 閱讀 6425

1. 中根遍歷

思路:

一直遍歷左子樹 p = p->left;

直到p為空。此時訪問棧頂元素,棧頂元素出棧。開始遍歷右子樹p = p->right;

遍歷右子樹的左子樹

出棧時訪問

/**

1. definition for a binary tree node.

2. struct treenode

7. };

*/class solution

stack

ss;treenode* p = root;

while(ss.empty()==false || p!=null)

else

}return ret;

}};

2. 先根遍歷

與中根思路一樣。僅僅是在入棧即訪問該節點

class solution 

stack

ss;treenode * p = root;

while(ss.size() != 0 || p!=null)

else

}return ret;

}};

還有一種思路:

先把根壓入棧,出棧時才訪問。

依照右左順序把兩個孩子壓棧

class solution 

stack

ss;ss.push(root);

while(ss.empty()==false)

if(p->left != null)

}return ret;

}};

比較推薦另外一種,僅僅是第一種與樹的中根遍歷基本同樣除了訪問位置。便於記憶。

3. 後根遍歷

採用上述中根和先根統一的思路。前兩者都須要訪問完左子樹(左回),即能夠pop當前節點。再訪問右子樹

不同於上述兩者,後根鬚要訪問完右子樹才幹pop當前節點(右迴),因此新定義了乙個標記,開始訪問右子樹時標記該節點。

當p為空,且棧頂元素被標記才訪問棧頂元素。

class solution 

stack

ss;unordered_map

bool> mymap; //here

treenode *p = root;

while(ss.empty()==false || p!=null)

else

else}}

return ret;

}};

樹的遍歷遞迴非遞迴

1先序 遞迴 class solution public void b list list,treenode tree 非遞迴 class solution else return list 2中序 遞迴 class solution public void b list list,treenode...

樹的非遞迴遍歷

在vs2011版本中除錯通過。include stdafx.h include stack.h include 標準庫中定義的棧 includeusing namespace std define max len 15 void create tree treenode head,char pdat...

樹的非遞迴遍歷

include using namespace std 1 2 3 4 5 6 7 8 void pre order treenode root cout root left pre order root right void in order treenode root in order root...