二叉树三种遍历的非递归形式
2017-04-06 14:14
351 查看
前序遍历非递归算法
public void preOrderNonRecursion(BinaryTreeNode<T> root){ // 非递归前序遍历 LLStack<BinaryTreeNode<T>> stack = new LLStack<>(); while(true){ while(root != null){ System.out.println(root.getData()); stack.push(root); root = root.getLeft(); } if(stack.isEmpty()) break; root = stack.pop().getRight(); } }
中序遍历非递归算法
public void inOrderNonRecursion(BinaryTreeNode<T> root){ // 非递归中序遍历 LLStack<BinaryTreeNode<T>> stack = new LLStack<>(); while(true){ while(root != null){ stack.push(root); root = root.getLeft(); } if(stack.isEmpty()) break; root = stack.pop(); System.out.println(root.getData()); root = root.getRight(); } }
前序遍历和中序遍历的非递归很相似,只是输出的位置不一样而已,下面的后续遍历非递归有点难理解,不过感觉比数据结构课上学的简单。这是自己根据一本书上的改的:
后续遍历非递归算法
public void postOrderNonRecursion(BinaryTreeNode<T> root){ // 后序遍历非递归算法 LLStack<BinaryTreeNode<T>> stack = new LLStack<>(); while(true){ if(root != null){ stack.push(root); root = root.getLeft(); } else { while(!stack.isEmpty() && root == stack.getTop().getRight()){ // 判断右子树是否遍历完成 root = stack.pop(); System.out.println(root.getData()); } // 判断上述while循环退出的原因 if(stack.isEmpty()) // 如果是因为栈为空,退出外层循环 break; else // 如果是因为右子树未遍历完,将右子树作为根结点循环 root = stack.getTop().getRight(); } } }
我构造了如下二叉树来验证:
得到的
4000
结果:
当然,不排除有其他特例,如有错误,欢迎指正。
完整代码可以访问我的GitHub:https://github.com/StriverLi/Data-Structures-and-Algorithms-in-Java/blob/master/src/tree/BinaryTreeNode.java
相关文章推荐
- 二叉树三种遍历算法递归和非递归实现
- 二叉树的三种遍历方式(递归和非递归的实现方法)
- 二叉树的三种遍历方式的递归与非递归实现
- 二叉树的三种遍历,包括递归与非递归,c++语言
- 二叉树的三种遍历(递归+非递归)
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)
- 数据结构学习之-二叉树的三种递归遍历C++实现及相关应用
- 三种遍历二叉树各种算法(非递归)
- 二叉树三种非递归遍历实现
- java实现二叉树的创建及三种递归遍历
- 43 递归和非递归俩种方法实现二叉树的三种遍历
- 【数据结构】二叉树的三种遍历--(递归+非递归)
- 二叉树三种遍历的递归和迭代解法
- 二叉树的三种遍历(递归+非递归)
- 二叉树三种非递归遍历
- 二叉树三种遍历算法的递归和非递归实现(C++)
- 二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)
- 二叉树的三种遍历,递归与非递归
- 二叉树前序中序后序遍历的非递归形式
- 二叉树的三种非递归遍历和morris遍历