二叉树遍历
来源:互联网 发布:ubuntu卸载samba 编辑:程序博客网 时间:2024/06/11 12:32
用递归和非递归实现二叉树遍历
1.非递归先序遍历
访问顺序:中-左-右
具体过程:①申请一个栈stack,初始化时,将头结点压入堆栈;
②从栈中弹出头结点,如果头结点的右孩子不为空,那么将右孩子压入栈;如果左孩子不为空,将左孩子压入栈;
③重复上面②的操作,直到堆栈为空,此时结束遍历
public void preOrder(TreeNode tr){ Stack stack=new Stack(); stack.push(tr); while(!stack.isEmpty){ TreeNode head=stack.pop(); if(head.right!=null) stack.push(head.right); if(head.left!=null) stack.push(head.left); System.out.println(head); }}
2.非递归中序遍历
访问顺序:左-中-右
具体过程:①申请一个栈stack,空结点cur,初始化时,将根结点赋值给cur结点并且该结点压入堆栈
②如果cur结点的左孩子不为空,那么将左孩子压入堆栈,并且更新当前节点为cur结点;如果cur结点为空,弹出堆栈中头结点,打印出头节点,并且将cur结点赋值为头结点的右孩子。
③反复执行②,直到整个堆栈为空,并且cur指针为空时,循环结束
public void inOrder(TreeNode tr){ Stack stack=new Stack(); TreeNode cur=tr; while(!stack.isEmpty() || cur!=null){ if(cur!=null){ stack.push(cur); cur=cur.left; }else{ TreeNode node=stack.pop(); System.out.println(node.val); cur=node.right; } }}
3.非递归后序遍历
访问顺序:左-右-中
双栈法
具体过程:①申请两个堆栈,stack1,stack2,初始化时,将根结点推入堆栈stack1。
②弹出堆栈stack1头结点,如果左孩子不为空,将其推入堆栈stack1,如果右孩子不为空,将其推入堆栈stack1,将头结点推入stack2.
③直至stack1,为空,结束遍历,然后打印stack2中的元素
public void postOrder(TreeNode tn){ Stack st1=new Stack(); st1.push(tn); Stack st2=new Stack(); while(!st1.isEmpty()){ TreeNode t=st1.pop(); if(t.left!=null) st1.push(t.left); if(t.right!=null) st2.push(t.right); st2.push(t); } while(!st2.isEmpty()){ System.out.print(st2.pop().val); }}
阅读全文
0 0
- 二叉树遍历、分层遍历
- 遍历二叉树--二叉树
- 【树】遍历二叉树
- 二叉树遍历
- 二叉树遍历
- 二叉树的遍历
- (原创)遍历二叉树
- 二叉树遍历-php
- 查找--遍历二叉树
- 遍历二叉树
- 二叉树遍历规则
- 二叉树的遍历
- 二叉树遍历
- 遍历二叉树
- 二叉树遍历问题
- 二叉树遍历
- 二叉树遍历(zz)
- 二叉树的遍历
- 渣渣萌新咸鱼的ACM刷题之路
- 外媒称AI的真正威胁是贫富分化
- POJ2349 Arctic Network 题解【最小生成树】【Kruskal】【图论】
- 自动注册/proc文件
- Android Studio 彻底断开于SVN的连接
- 二叉树遍历
- HBase Thrift
- PAT B1001. 害死人不偿命的(3n+1)猜想
- Android蓝牙连接FT232单片机
- IAR for ARM介绍、下载、安装与注册
- js实现图片上传预览(一张一张上传)
- extjs问题1
- 刷题记录-luoguP1991 无线通讯网
- Windows系统下如何配置虚拟域名 Apache服务器