您的位置:首页 > 编程语言 > Java开发

二叉树非递归遍历实现-java版本

2015-12-12 10:52 423 查看
最近看了一下二叉树非递归遍历的实现,现在将思路写出来,若有不对,希望大家能够指出

//二叉树非递归先序遍历
private void preOrderBSTByUnRecur(Node head){
//先判断头节点是否为空
if(head != null){
Stack<Node> stack = new Stack<Node>();
//先顺遍历是先父节点,然后父节点的左儿子,父节点的右儿子,
//所以先要将父节点压入栈
stack.add(head);
//只要栈不为空则表示二叉树没有遍历完成
while(!stack.isEmpty()){
//先序遍历比较简单,访问父节点弹出后立即打印
//并判断是否右结点,有则入栈,然后判断是否有
//左结点,有则入栈
head = stack.pop();
System.out<
4000
span class="hljs-built_in">.println(head.data);
//会有人问为什么先右后左,因为父结点读取值
//后不保存状态,所以先将右儿子压入栈,然后
//再判断是否有左儿子,有的话下一次操作则先
//对左儿子进行操作,符合先序遍历的逻辑
if(null != head.rightChild)
stack.add(head.rightChild);
if(null != head.leftChild)
stack.add(head.leftChild);
}
}
}

//二叉树非递归中序遍历
private void inOrderBSTByUnRecur(Node head){
if(head != null){
Stack<Node> stack = new Stack<Node>();
//中序遍历是先左儿子,父结点,右儿子,所以循环条件
//是栈不为空且当前结点不为空
while(!stack.isEmpty() || head != null){
//只要父结点的左儿子不为空,则进行进栈操作
if(head != null){
stack.push(head);
head = head.leftChild;
}else{
//此时已经将整颗二叉树的最左端的
//左儿子压入栈,然后弹出并读值,取其右节点,
//这时候有两种情况:1.右结点存在,则进入上一个判断
//取他的左儿子2.若右结点不存在,那么继续弹出并读值
head = stack.pop();
System.out.println(head.data);
head = head.rightChild;
}

}
}
}

//非递归后续遍历
private void postOrderBSTByUnRecur(Node head){
if(null != head){
Stack<Node> stack = new Stack<>();
//cur为stack的栈顶元素,pre为最后一个被打印的元素(初始值为根节点)
Node cur = null,pre = head;
//先将根节点押入
stack.push(pre);
//stack为空则表示整个二叉树已遍历完
while(!stack.isEmpty()){
//cur为stack中的栈顶元素
cur = stack.peek();
//有三种情况,1.栈顶元素的左节点不为空,而最后打印元素不等于栈顶元素的左节点与右节点,
//表示栈顶元素的左节点还未遍历,则入栈
if(cur.leftChild != null && pre != cur.leftChild && pre != cur.rightChild){
stack.push(cur.leftChild);
//2.栈顶元素的右节点不为空,而最后打印元素不等于栈顶元素的右节点,
//表示栈顶元素的右节点还未遍历,则入栈
}else if(cur.rightChild != null && pre != cur.rightChild){
stack.push(cur.rightChild);
//3.最后,若栈顶元素的左右节点都已经被遍历或者为空,则出栈并打印,跟新最新打印节点
}else{
System.out.println(stack.pop().data);
pre = cur;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 java 遍历 递归