非递归方式 实现 前中后序遍历二叉树
作者:擎天圣同学
- 2023-08-28 浙江
本文字数:1847 字
阅读完需:约 6 分钟
非递归方式 实现 前中后序遍历二叉树. 充分利用 stack 和 queue 的特性来存储状态
非递归方式 实现 前中后序遍历二叉树. 充分利用 stack 和 queue 的特性来存储状态
public class Code03_UnRecursiveTraversalBT_chang_done {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int v) {
value = v;
}
}
/* 按照前序遍历的逻辑 先来head再找左子树去弹头节点
* 来一个节点 利用压栈弹栈来存储弹出节点 控制顺序
* head先弹出, 压入右左
* 下一轮 弹head 压入右左 直到左右节点没有子节点 继续弹出左右节点
*
*
* => 头右左 就很容易 再用一个stack来暂存要打印的 最后再打印 => 左右头 后序遍历
*/
public static void pre(Node head) {
System.out.print("pre-order: ");
if (head != null) {
//建立stack
Stack<Node> stack = new Stack<>();
stack.push(head);
//提前处理 便于统一while处理
while (!stack.isEmpty()) {
//弹出head 打印
Node tempHead = stack.pop();
System.out.print(tempHead.value + " ");
//压入右左
if (tempHead.right != null) {
stack.push(tempHead.right);
}
if (tempHead.left != null) {
stack.push(tempHead.left);
}
}
}
System.out.println();
}
//整棵树按左边界分解 (见笔记图) 符合中序遍历的逻辑: 左节点 中节点 右节点
//
public static void in(Node cur) {
System.out.print("in-order: ");
if(cur!=null){
Stack<Node> stack = new Stack<>();
while(!stack.isEmpty() || cur != null){ //未到到最右下节点的条件 根据左边界分解, 到最右下时 俩东西为空了
//统一压入左边界(包含了多个左节点和头节点 且他们交叉压入的)
if(cur!=null){
stack.push(cur);
cur = cur.left;
}else{
//到达最左下节点后 cur为null 弹出自己
Node tempNode = stack.pop();
System.out.print(tempNode.value+" ");
cur = tempNode.right; //为空 让下一轮弹头节点
}
}
}
System.out.println();
}
public static void pos1(Node head) {
System.out.print("pos1-order: ");
//准备两个stack 第二个用来存储pre变种要打印的 最后才统一打印
Stack<Node> stack1 = new Stack<>();
Stack<Node> stack2 = new Stack<>();
if(head != null){
stack1.push(head);
while(!stack1.isEmpty()){
Node tempNode = stack1.pop();
stack2.push(tempNode);
if(tempNode.left !=null){ //pre变种 头左右 -> 头右左
stack1.push(tempNode.left);
}
if(tempNode.right !=null){
stack1.push(tempNode.right);
}
}
}
while(!stack2.isEmpty()){
System.out.print(stack2.pop().value+" ");
}
System.out.println();
}
public static void main(String[] args) {
Node head = new Node(1);
head.left = new Node(2);
head.right = new Node(3);
head.left.left = new Node(4);
head.left.right = new Node(5);
head.right.left = new Node(6);
head.right.right = new Node(7);
pre(head);
System.out.println("====头左右====");
in(head);
System.out.println("====左头右====");
pos1(head);
System.out.println("====左右头====");
// pos2(head);
System.out.println("========");
}
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
擎天圣同学
关注
还未添加个人签名 2019-12-01 加入
还未添加个人简介
评论