【算法】图解二叉树的前中后序遍历

devtools/2025/1/17 6:36:24/

目录

1.递归序实现

2.非递归实现


二叉树的节点结构

java">public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}
}

1.递归序实现

递归的方法遍历二叉树时每一个节点都会被访问三次

java">public static void f(Node head) {//第1次访问当前节点if (head == null) {return;}//第1次访问结束f(head.left);//第2次访问当前节点//第2次访问结束f(head.right);//第3次访问当前节点//第3次访问结束
}

java">递归序
1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1

在递归序的基础上衍生出了三种顺序的遍历,先序中序后序

先序:先打印头节点,再打印左子树上所有的节点,最后打印右子树上所有的节点。可以利用递归序,仅当第一次来到一个节点时才打印

java">public static void preOrderRecur(Node head) {if (head == null) {return;}System.out.print(head.value + " ");preOrderRecur(head.left);preOrderRecur(head.right);
}
java">先序(根左右)
1,2,4,5,3,6,7

中序:先打印左子树上所有的节点,再打印头节点,最后打印右子树上所有的节点。可以利用递归序,仅当第二次来到一个节点时才打印

java">public static void inOrderRecur(Node head) {if (head == null) {return;}inOrderRecur(head.left);System.out.print(head.value + " ");inOrderRecur(head.right);
}
java">//中序(左根右)
4,2,5,1,6,3,7

后序:先打印左子树上所有的节点,再打印右子树上所有的节点,最后打印头节点。可以利用递归序,仅当第三次来到一个节点时才打印

java">public static void posOrderRecur(Node head) {if (head == null) {return;}posOrderRecur(head.left);posOrderRecur(head.right);System.out.print(head.value + " ");
}
java">//后序(左右根)
4,5,2,6,7,3,1

2.非递归实现

准备一个栈

  • 先序遍历

首先根节点入栈

(1) 每次从栈中弹出一个节点cur

(2) 处理(打印)cur

(3) 如果可以,先把右孩子压入栈,再把左孩子压入栈

(4) 重复这个过程

java">public static void preOrderRecur(Node head) {if (head != null) {Stack<Node> stack = new Stack<Node>();stack.add(head);while (!stack.isEmpty()) {head = stack.pop();System.out.print(head.value + " ");if (head.right != null) {stack.push(head.right);}if (head.left != null) {stack.push(head.left);}}}System.out.println();
}
  • 后序遍历

我们在先序遍历中做以下改动

额外准备一个收集栈(总共有两个栈)

首先根节点入栈

(1) 每次从栈中弹出一个节点cur

(2) 把cur放入收集栈中

(3) 如果可以,先把左孩子压入栈中,再把右孩子压入栈中

(4) 重复这个过程

(5) 弹出收集栈中的所有元素并打印

java">public static void posOrderUnRecur1(Node head) {if (head != null) {Stack<Node> s1 = new Stack<Node>();Stack<Node> s2 = new Stack<Node>();s1.push(head);while (!s1.isEmpty()) {head = s1.pop();s2.push(head);if (head.left != null) {s1.push(head.left);}if (head.right != null) {s1.push(head.right);}}while (!s2.isEmpty()) {System.out.print(s2.pop().value + " ");}}System.out.println();
}
  • 中序遍历

先把整棵树的左边界全部压入栈,左边界指从当前根节点开始一直.left直至null

在依次弹出并打印节点的过程中对当前节点的右子树重复这个操作,

java">​​​​​​​public static void inOrderUnRecur(Node head) {if (head != null) {Stack<Node> stack = new Stack<Node>();while (!stack.isEmpty() || head != null) {if (head != null) {stack.push(head);head = head.left;} else {head = stack.pop();System.out.print(head.value + " ");head = head.right;}}}System.out.println();
}

http://www.ppmy.cn/devtools/151198.html

相关文章

【微信小程序】let和const-综合实训

let 和 const 都是用于声明变量的关键字&#xff0c;它们与传统的 var 关键字相比&#xff0c;有很多不同之处。 let 声明块级作用域变量&#xff0c;可再赋值&#xff1b;const 声明块级作用域常量&#xff0c;不可再赋值。 以下是它们的详细介绍&#xff1a; 一、基本概念…

Ruby语言的网络编程

Ruby语言的网络编程 引言 Ruby是一种高度抽象的动态编程语言&#xff0c;以其简洁的语法和强大而灵活的功能而闻名。自1995年由松本行弘&#xff08;Yukihiro Matsumoto&#xff09;发布以来&#xff0c;Ruby便吸引了无数开发者&#xff0c;尤其是在Web开发领域。随着互联网的…

【Uniapp-Vue3】pages.json页面路由globalStyle的属性

项目的全局配置在pages.json中。 一、导航栏设置 二、下拉刷新设置 下拉就可以看到设置的样式 三、上拉触底 这个页面中&#xff0c;向下滑动页面到底部就会输出“到底了” 现在将触底距离设置为500 走到半路就会输出“到底了”

FastDDS安装测试记录

1、安装依赖的软件 sudo apt install cmake g python3-pip wget git sudo apt install libasio-dev libtinyxml2-dev sudo apt install libssl-dev sudo apt install libp11-dev libengine-pkcs11-openssl sudo apt install softhsm22、安装foonathan_memory_vendor cd ~/Fas…

JVM远程调试原理剖析

一、如何开启JVM远程调试 当一个 Java 应用启动时&#xff0c;JVM 会根据启动参数配置其运行环境。使用 -agentlib:jdwp 参数启动远程调试功能&#xff0c;JVM 会初始化调试代理。 agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your_application.jar…

【数据结构】快排之三路划分+文件归并排序

排序 一.快排1.快排性能分析2.快排之三路划分3.快排之内省排序 二.归并1.外排序2.文件归并排序 一.快排 1.快排性能分析 决定快排性能的关键点是每次单趟排序后&#xff0c;key对数组的分割&#xff0c;如果每次选key基本二分居中&#xff0c;那么快排的递归树就是颗均匀的满…

设置virtualBox7.0.12 ubuntu24.10 和 windows之间双向复制共享剪贴板

虚拟机配置如下&#xff1a; 在Ubuntu终端输入以下指令&#xff1a;(如果虚拟机重启之后剪贴板不共用了&#xff0c;再次执行第二条指令启动服务就可以解决&#xff0c;Ubuntu终端中复制有时需要使用右键->复制才会到剪贴板上) sudo apt install virtualbox-guest-x11 sudo…

Vue3大事件管理系统

大事件项目介绍与创建 Vue3 大事件管理系统 pnpm 包管理器-创建项目 创建项目 Eslint 配置代码风格 配置代码检查工作流 提交前做代码检查 暂存区 eslint 校验 总结 目录调整 Vue-router4 路由代码解析 路由初始化 总结 引入 Element Plus 自建库 按需引入 Element …