您的位置:首页 > 其它

二叉树三种遍历的非递归形式

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息