递归方式实现后序遍历 - lovemoganna/DataStructure GitHub Wiki
PosOrderRecur
public void PosOrderRecur(Node node){
if(head == null){
return;
}
posOrderRecur(head.left);//打印左孩子
posOrderRecur(head.right);//打印右孩子
sysout(head.value+""); //打印头结点
}
非递归的实现方式: 原理:
- 申请一个栈,记为S1,然后将头结点压入S1中.
- 从S1中弹出的节点记为cur,然后把cur的左孩子压入S1中,然后把cur1的右孩子压入S1中.
- 在整个过程,每一个从S1中弹出的节点,都放进第二个栈S2中.
- 不断重复2,3,一直到S1为null,过程停止
- 从S2中一次弹出节点并打印,打印的顺序就是后续遍历的顺序了.
初始树:
1
/ \
2 3
/ \ / \
4 5 6 7
使用2个栈完成的过程
| | | |
---- ----
栈S1 与 栈S2
先把node1压入S1,令node1=cur,弹出node1并压入S2中,
| 1 | | |
----- ------
S1 S2
接下来先压入cur=node1的左孩子node2,再压入右孩子node3进入S1中, 弹出node3压入S2
| 3 |
------
| 2 | | 1 |
----- ------
S1 S2
再压入cur=node3的左孩子node6和右孩子node7,弹出node7压入到S2中,
cur=node7没有孩子,所以弹出node6将它压入到S2中.
| 7 |
-----
| 6 | | 3 |
------ -----
| 2 | | 1 |
----- ------
S1 S2
变为
| 6 |
------
| 7 |
------
| 3 |
------ -----
| 2 | | 1 |
----- ------
S1 S2
node6没孩子,弹出node2压入栈S2
再把node2的孩子压入S1
| 2 |
------
| 6 |
------
| 7 |
------
| 5 | | 3 |
------ -----
| 4 | | 1 |
----- ------
S1 S2
最终压入S2的数是:4 5 2 6 7 3 1
用一个栈来实现的方法