先序遍历
实现过程
根据先序遍历的顺序,先访问根节点,再访问左子树,后访问右子树,而对于每个子树来说,又按照同样的访问顺序进行遍历。非递归的实现思路如下:
对于任一节点P,
1)输出节点P,然后将其入栈,再看P的左孩子是否为空;
2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作;
3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;
4)若不为空,则循环至1)操作;
5)如果为空,则继续出栈,并将出栈节点的右孩子置为当前节点,看其是否为空,重复4)和5)操作;
6)直到当前节点P为null并且栈空,遍历结束。
代码
//前序遍历非递归的方式
public static void preOrderNonRecursive(BinaryTreeNode root) {
Stack<BinaryTreeNode> stack = new Stack<>();
// 当root不为null或者栈不为空那么一直循环
// 直到当前节点root为null且栈空时,循环结束
while (root != null || !stack.isEmpty()) {
//从根节点开始,输出当前节点,并将其入栈,
//同时置其左孩子为当前节点,直至其没有左孩子,即当前节点为null
System.out.print(root.value + "\t");
stack.push(root);
root = root.left;
//如果当前节点root为null且栈不空,则将栈顶节点出栈,
//同时置其右孩子为当前节点,循环判断,直至root不为空
while(root == null && !stack.isEmpty()) {
root = stack.pop();
root = root.right;
}
}
}