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...