算法笔记—二叉树遍历

二叉树

  • 1. 递归遍历
    • 1. 先序遍历
    • 2. 中序遍历
    • 3. 后序遍历
  • 2. 非递归遍历
    • 2.1 先序遍历
    • 2.2 中序遍历
    • 2.3 后序遍历
      • 2.3.1 两栈实现
      • 2.3.2 一栈实现

1. 递归遍历

二叉树的结构定位为:

	public static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int v) {val = v;}}

1. 先序遍历

	// 递归先序遍历public static void preOrder(TreeNode head){if (head == null){return;}System.out.print(head.val+" "); // 打印preOrder(head.left); // 递归左子树preOrder(head.right); // 递归右子树}

2. 中序遍历

	// 递归中序遍历public static void inOrder(TreeNode head){if (head == null){return;}inOrder(head.left); // 递归左子树System.out.print(head.val+" "); // 打印inOrder(head.right); // 递归右子树}

3. 后序遍历

    public static void posOrder(TreeNode head){if (head==null){return;}posOrder(head.left);posOrder(head.right);System.out.print(head.val + " ");}

2. 非递归遍历

2.1 先序遍历

	// 栈实现非递归先序遍历public static void preOrder(TreeNode head){if (head!= null){Stack<TreeNode> stack = new Stack<>();stack.push(head);while (!stack.isEmpty()){head = stack.pop();System.out.print(head.val + " ");// 栈先进后出 先序中左右 先压右再压左if (head.right != null){stack.push(head.right);}if (head.left != null){stack.push(head.left);}}System.out.println();}}

2.2 中序遍历

	// 栈实现非递归中序遍历 左中右// 原理还是先处理节点的左树 再到自己 再处理右树// 1. 子树的左边界全部进栈 进步骤 2// 2. 栈弹出节点并打印 此节点右树重复步骤 1// 3. 没有子树, 且栈空结束public static void inOrder(TreeNode head){if (head != null){Stack<TreeNode> stack = new Stack<>();while (!stack.isEmpty() || head != null){ // head != null 有树// 步骤1if (head != null){stack.push(head);head = head.left;// 步骤2} else {head = stack.pop();System.out.print(head.val + " ");head = head.right;}}System.out.println();}}

2.3 后序遍历

2.3.1 两栈实现

	// 栈实现非递归后序遍历 两个栈// 思路: 先序(中左右)---> 中右左 ---> 后序(左右中)public static void posOrderTwoStack(TreeNode head){if (head!= null){Stack<TreeNode> stack = new Stack<>();Stack<TreeNode> collect = new Stack<>();stack.push(head);while (!stack.isEmpty()){head = stack.pop();collect.push(head); // 不打印 按照中右左进栈if (head.left != null){stack.push(head.left);}if (head.right != null){stack.push(head.right);}}// 出栈 左右中while (!collect.isEmpty()){System.out.print(collect.pop().val+ " ");}System.out.println();}}

2.3.2 一栈实现

	// 栈实现非递归后序遍历 一个栈public static void posOrderOneStack(TreeNode h){if (h != null){Stack<TreeNode> stack = new Stack<>();stack.push(h);// 如果始终没有打印过节点, h就一直是头结点// 一旦打印过节点, h就变成打印节点// 之后h的含义: 上一次打印的节点while (!stack.isEmpty()){TreeNode cur = stack.peek();// 取栈顶元素if (cur.left != null && h != cur.left && h!= cur.right){// 有左树且左树没有被处理过stack.push(cur.left);}else if (cur.right != null && h!= cur.right){// 有右树且右树没有被处理过stack.push(cur.right);}else {// 左树 右树 没有 或者 都被处理过了System.out.print(cur.val + " ");h = stack.pop(); // 指向上次打印节点}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CountDownLatch详解以及用法示例

一、什么是CountDownLatch CountDownLatch中count down是倒数的意思&#xff0c;latch则是门闩的含义。整体含义可以理解为倒数的门栓。 CountDownLatch的作用也是如此&#xff0c;在构造CountDownLatch(int count)&#xff1a;的时候需要传入一个整数count&#xff0c;在这个…

PortSwigger Access Control

lab1: Unprotected admin functionality 访问robots.txt 进了删除即可 lab2: Unprotected admin functionality with unpredictable URL 访问admin-d0qwj5 lab3: User role controlled by request parameter 发现Cookie中存在判断是否为admin lab4: User role can be modifie…

gitattributes配置文件的作用

0 Preface/Foreword 0.1 基本概念 Git版本管控工具功能强大&#xff0c;在使用过程中&#xff0c;在多人合作的项目开发过程中&#xff0c;经常会遇到提交代码时出现的warning提醒&#xff0c;尤其是换行符。 Linux/Unix/Mac OS操作系统的换行符使用LF符号&#xff08;\n&am…

逆向P1P2总结

字节八位 word 16位 deword 32 位 00 00 00 e8 是存储32位信息的起点 不是程序运行的起点 为什么电脑有32位与64位之分 寻址宽度 以字节为单位 0xfffffff 1 就是最大容量 转为十进制为 4294967296 / 1024 &#xff08;k&#xff09;/1024 &#xff08;kb&#xff09;/ 1…

web功能实例 - Canvas裁剪工具

嗯,手撸官方文档2天&#xff0c;发现没啥用&#xff0c;尤其是动画,那种计算出来的&#xff0c;根本想不到。因此学着学了抱着要做个东西的想法,去网上找相关案例,最终做出了这个裁剪工具。 PS :先说一下思路: 核心实现有3个canvas图层, 其中一个负责图片的预览。另外2个叠加到…

【华为机试】2023年真题B卷(python)-发广播

一、题目 题目描述&#xff1a; 某地有N个广播站&#xff0c;站点之间有些有连接&#xff0c;有些没有。有连接的站点在接受到广播后会互相发送。 给定一个N*N的二维数组matrix,数组的元素都是字符’0’或者’1’。 matrix[i][j]‘1’,则代表i和j站点之间有连接&#xff0c;mat…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中&#xff0c;玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏&#xff0c;它不仅提供了一个有趣的辨色挑战&#xff0c;还能帮助玩…

vue组件的类型及特点

vue组件的类型及特点 如果想要对组件进行类型划分&#xff0c;从实现的功能以及所具备的特点来划分&#xff0c;大致可以归纳为&#xff1a;动态组件、缓存组件、异步组件、函数式组件 JSX、递归组件等 动态组件&#xff1a;通过动态确定要显示的组件, is指定要显示组件的组件…

leetcode2两数加和问题(链表)

题目思路&#xff1a; ①创建一个int类型的局部变量&#xff0c;用来存储两个结点的Val值。 ②判断该Val值与10求余(mod)后是否大于0,如果大于0, 则需要在下一个结点进位。 ③最关键的步骤&#xff1a;实现l1&#xff0c;l2结点数值相加后构建新的存储求和后的结点&#xff0…

.NET Framework 对应系统版本汇总

复选标记图标 ✔️ 表示默认安装 .NET Framework 的操作系统版本。加号图标 ➕ 表示 .NET Framework 未安装但可以安装的操作系统版本。星号 * 表示必须在控制面板中&#xff08;如果是 Windows Server&#xff0c;则通过服务器管理器&#xff09;启用 .NET Framework&#xff…

IntelliJ IDEA插件

插件安装目录&#xff1a;C:\Users\<username>\AppData\Roaming\JetBrains\IntelliJIdea2021.2\plugins aiXcoder Code Completer&#xff1a;代码补全 Bookmark-X&#xff1a;书签分类 使用方法&#xff1a;鼠标移动到某一行&#xff0c;按ALT SHIFT D

Iptables深度解析:四表五链与动作参数

Iptables是Linux系统中强大的网络流量控制工具&#xff0c;它通过四种主要的表&#xff08;raw、mangle、nat、filter&#xff09;和五条链&#xff08;INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING&#xff09;来实现对数据包的过滤、修改和地址转换。 表的概述 在ipta…

修改PCIE 设备控制寄存器DevCtl2参数

如何修改PCIE 设备控制寄存器DevCtl2参数&#xff1f; 参考书籍&#xff1a;PCI_Express_Base_Spec 如图所示&#xff1a;输入Lspci -s 00&#xff1a;08&#xff1a;00 -vvv|grep - i deve 输出DevCap、DevCtl、DevCap2、DevCtl2参数&#xff0c;本节重点分析UEFI BIOS怎么设置…

FPGA分频电路设计(2)

实验要求&#xff1a; 采用 4 个开关以二进制形式设定分频系数&#xff08;0-10&#xff09;&#xff0c;实现对已知信号的分频。 类似实验我之前做过一次&#xff0c;但那次的方法实在是太笨了&#xff1a; 利用VHDL实现一定系数范围内的信号分频电路 需要重做以便将来应对更…

JUC并发编程 09——队列同步器AQS

目录 一.Lock接口 1.1Lock的使用 1.2Lock接口提供的 synchronized 不具备的主要特性 1.3Lock接口的所有方法 二.队列同步器(AQS) 2.1队列同步器的接口与示例 2.2AQS实现源码分析 ①同步队列 ②获取锁 ③释放锁 一.Lock接口 说起锁&#xff0c;你肯定会想到 synchron…

Android Studio 如何实现软件英文变中文教程

目录 前言 一、确认版本号 二、下载汉化包 三、汉化包安装 四、如何实现中英文切换 五、更多资源 前言 Android Studio是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Android应用程序。默认情况下&#xff0c;Android Studio的界面和…

js中Math.min(...arr)和Math.max(...arr)的注意点

当arr变量为空数组时&#xff0c;这两个函数和不传参数时的结果是一样的 Math.max() // -Infinity Math.max(...[]) // -InfinityMath.min() // Infinity Math.min(...[]) // Infinity

如何编写高效清晰的嵌入式C程序

作为嵌入式工程师&#xff0c;怎么写出效率高、思路清晰的C语言程序呢? 要用C语言的思维方式来进行程序的构架构建 要有良好的C语言算法基础&#xff0c;以此来实现程序的逻辑构架 灵活运用C语言的指针操作 虽然看起来以上的说法很抽象&#xff0c;给人如坠雾里的感觉&…

RocketMQ与SpringBoot实际项目中使用

消息生产者 1&#xff09;添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version> </parent><properties><rocketm…

data 为什么是一个函数

在前端开发中&#xff0c;特别是在使用Vue.js框架时&#xff0c;"data" 通常是一个函数&#xff0c;而不是一个变量。这是因为在Vue组件中&#xff0c;"data" 是一个函数&#xff0c;用于返回包含组件状态的对象。这样做有以下几个原因&#xff1a; 避免数…