写点什么

非递归方式 实现 前中后序遍历二叉树

作者:擎天圣同学
  • 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("========"); }
}
复制代码


用户头像

还未添加个人签名 2019-12-01 加入

还未添加个人简介

评论

发布
暂无评论
非递归方式 实现 前中后序遍历二叉树_递归_擎天圣同学_InfoQ写作社区