二叉树的先序遍历 - lovemoganna/DataStructure GitHub Wiki
PreOrderRecur
用递归方式来实现二叉树的先序的遍历打印.
public void preOrderRecur(Node head){
if(head == null){
return;
}
sysout(head.value()+"");//先打印头节点
preOrderRecur(head.left);//遍历左子树
preOrderRecur(head.right);//再遍历右子树
}
非递归的形式遍历 过程:
- 首先申请一个新的栈,记为stack.
- 然后将头结点head压入stack中
- 每次从stack中弹出栈顶节点,记为cur,然后打印cur的值. 如果cur右孩子不为null,将cur的右孩子压入stack中. 最后如果cur的左孩子不为null的话,将cur的左孩子压入stack中.
- 不断重复步骤3,直到stack为null,全部过程结束.
初始树如下:
1
/ \
2 3
/ \ / \
4 5 6 7
第一步
申请一个新的栈stack,栈的规则是先进后出.
弹出打印 1
| 1 | --------->
--------
stack
把node1压入栈中,弹出并打印它
规则:
每次从stack中栈顶节点记为cur,然后打印cur的值.
如果cur右孩子不为null的话,先将cur的右孩子先压入stack中.
最后如果cur的左孩子不为null的话,将cur的左孩子压入stack中.
第二步:
把node1的左孩子和右孩子压入栈中
| 2 | 弹出栈顶node2的值
------ -------->
| 3 | 发现node2有左孩子和右孩子,所以先压入node2的右孩子,再压入node2的左孩子
-----
结果如下
| 4 | 依次弹出栈顶的node4的值
------ 弹出栈顶的node5的值
| 5 | 弹出栈顶的node3的值
-------- ------------>
| 3 | 现在发现node4,5都没左右节点,只有node3还有左右节点6,7
--------
所以进行下一步压栈过程
| 6 |
-------- 先弹出node6
| 7 | ----------->
-------- 在弹出node7
根据弹出结果的顺序:
先序遍历的结果是:1 2 4 5 3 6 7