Day9 25/2/22 SAT

【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p=4&vd_source=04ee94ad3f2168d7d5252c857a2bf358

目录

5、二叉树

5.0 二叉树节点结构

5.1 前序/中序/后序遍历 & 递归/非递归实现

5.1.1 前序/中序/后序遍历区分

5.1.2 递归实现

5.1.3 非递归实现

5.2 直观地打印一棵二叉树

5.3 二叉树的宽度优先遍历

5.4 二叉树类型判断

二叉搜索树

完全二叉树

真二叉树

满二叉树

平衡二叉树


笔记:

5、二叉树

5.0 二叉树节点结构

class Node<V>{V calue;Node left;Node right;
}

5.1 前序/中序/后序遍历 & 递归/非递归实现

5.1.1 前序/中序/后序遍历区分

在二叉树中,遍历的顺序指的是访问节点的顺序:

前序遍历(Pre-order Traversal):根节点 -> 左子树 -> 右子树。

中序遍历(In-order Traversal):左子树 -> 根节点 -> 右子树。

后序遍历(Post-order Traversal):左子树 -> 右子树 -> 根节点。

主要区别在于根节点的访问时机:

前序遍历最先访问根节点。

中序遍历,根节点在左右子树都访问完成后才被访问。

后序遍历最后访问根节点。

5.1.2 递归实现

class Node<V>{V calue;Node left;Node right;
}// 前序遍历
public void preOrder(Node root) {if (root == null) return;System.out.print(root.val + " ");  // 先访问根节点preOrder(root.left);               // 再遍历左子树preOrder(root.right);              // 最后遍历右子树
}// 中序遍历
public void inOrder(Node root) {if (root == null) return;inOrder(root.left);                // 先遍历左子树System.out.print(root.val + " ");  // 再访问根节点inOrder(root.right);               // 最后遍历右子树
}//后序遍历
public void postOrder(Node root) {if (root == null) return;postOrder(root.left);              // 先遍历左子树postOrder(root.right);             // 再遍历右子树System.out.print(root.val + " ");  // 最后访问根节点
}

5.1.3 非递归实现

任何递归函数都可以改成非递归函数,相当于不让系统自动压入栈,而是自己手动压入栈。栈是先进后出的。

前序遍历中,遍历顺序为“头左右”(头节点、左子节点、右子节点),操作:

step 1. 从栈中弹出一个节点N

step 2. 找到它的左、右子节点

step 3. 先压入栈右子节点,再压入左子节点(这样先弹出左子节点,再弹出右子节点)

public static void preorder(Node node){if(node != null){Stack<Node> stack = new Stack<Node>();stack.add(node);while( !stack.isEmpty() ){node = stack.pop();System.out.print(node.value + “ ”);if( node.right != null)stack.push(node.right);if( node.left != null)stack.push(node.left);}}
}

中序遍历中,遍历顺序为“左头右”(左子节点、头节点、右子节点),操作:

public static void inorder(Node node){if(node != null){Stack<Node> stack = new Stack<Node>();while( !stack.isEmpty() || node != null ){if( node != null){stack.push(node);node = node.left;}else{node = stack.pop();System.out.print(node.value + “ ”);node = node.right;}}}
}

后序遍历中,遍历顺序为“左右头”(左子节点、右子节点、头节点),操作:

public static void postorder(Node node){if(node != null){Stack<Node> s1 = new Stack<Node>();Stack<Node> s2 = new Stack<Node>();s1.push(node);while( !s1.isEmpty() ){node = s1.pop();s2.push(node);if( node.left!= null)s1.push(node.left);if( node.right!= null)s1.push(node.right);}while( !s2.isEmpty() ) System.out.print(s2.pop().value + “ ”);}
}

5.2 直观地打印一棵二叉树

class BinaryTreePrinter {// 打印二叉树的结构static void printTree(TreeNode root) {printTree(root, "", true);}// 辅助方法:递归打印每层节点private static void printTree(TreeNode node, String indent, boolean last) {if (node != null) {System.out.println(indent + (last ? "└── " : "├── ") + node.val);indent += last ? "    " : "│   ";printTree(node.left, indent, false);  // 打印左子树printTree(node.right, indent, true);  // 打印右子树}}public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);root.right.left = new TreeNode(6);root.right.right = new TreeNode(7);printTree(root);}
}

5.3 二叉树的宽度优先遍历

常见题目:求一颗二叉树的宽度,也就是树的每层最多存在了几个节点。

可以采用队列Queue进行辅助,队列的特性是先进先出。遍历完一层后要遍历下一层的节点时,每次弹出一个节点,再把它的左右子节点推进队列。

public static void broadReversal(Node node) {if (node == null) return;Queue<Node> queue = new LinkedList<>();queue.add(node);int maxWidth = 0;// 广度优先遍历while (!queue.isEmpty()) {// 获取当前层的节点数int levelSize = queue.size();maxWidth = Math.max(maxWidth, levelSize); // 更新最大宽度// 遍历当前层for (int i = 0; i < levelSize; i++) {Node current = queue.poll();System.out.print(current.value + " "); // 输出当前节点的值// 将左右子节点加入队列if (current.left != null) queue.add(current.left);if (current.right != null) queue.add(current.right);}System.out.println(); // 换行,表示一层的结束}System.out.println("Maximum width of the binary tree is: " + maxWidth);}

5.4 二叉树类型判断

与一个节点直接连接的子节点数,也叫“度数”。

度数为0即没有左右节点,度数为1则只有左节点或右节点,度数为2

二叉搜索树

是一类二叉树,左子树的key都小于当前节点的key、右子树的key都大于当前节点的key。

中序遍历后如果是升序,则是二叉搜索树。

完全二叉树

是一类二叉树,叶子节点只会出现在最后两层(最后一层可能不是满的),且最后一层的叶子节点都靠左对齐 特点:完全二叉树从root到倒数第二层是一棵满二叉树; 度数为1的节点只有左子树;

真二叉树

是一类二叉树,所有节点的度要么为0要么为2。

满二叉树

是一类二叉树,每一层都是满的,而且叶子节点都在同一层上。

平衡二叉树

每个节点都有一个平衡因子(balance factor)来确保树的高度始终保持在一个较小的范围内,从而保证查询、插入和删除操作的时间复杂度始终为O(logn)

性质:所有操作的时间复杂度都为O(logn)

①左右子节点的高度差的绝对值不超过1(the children of a node can differ by at most 1)

②左小右大

③height-balance  高度是平衡的

应用场景:适用于需要严格保证操作时间的场景(比如数据库搜索)

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

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

相关文章

OpenCV的形态学操作

在计算机视觉中&#xff0c;形态学操作是一种基于集合论的图像处理技术&#xff0c;主要用于分析和处理图像的形状特征。OpenCV 提供了 cv2.morphologyEx() 函数&#xff0c;用于执行多种高级形态学操作。 kernel np.ones((15, 15), np.uint8) 1. 开运算&#xff08;Opening&…

【Python爬虫(50)】从0到1:打造分布式爬虫项目全攻略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

KylinSP3 | 防火墙和麒麟安全增强设置KySec

一、系统防火墙原理 麒麟操作系统从V10版本开始&#xff0c;默认使用了Firewalld防火墙&#xff0c;Firewalld是能提供动态管理的防火墙&#xff0c;支持网络/防火墙区域&#xff0c;用于定义网络连接或接口的信任级别。支持IPv4和IPv6防火墙设置、以太网桥接和IP集。将运行时…

【NLP 23、预训练语言模型】

人类发明后悔&#xff0c;来证明拥有的珍贵 —— 25.1.15 Bert的优势&#xff1a;① 预训练思想 ② Transformer模型结构 一、传统方法 VS 预训练方式 Pre-train&#xff1a; ① 收集海量无标注文本数据 ② 进行模型预训练&#xff0c;并在任务模型中使用 Fine-tune&#xff1a…

嵌入式硬件基础知识

1.电阻(主要是贴片电阻) 01 基础课程-电阻 1.电阻封装 2.相关参数 1.功率额定值&#xff1a; 电阻能够长期承受的最大功率&#xff0c;功率过大可能导致电阻过热或损坏。封装尺寸越大&#xff0c;散热能力越强&#xff0c;功率额定值通常越高。 2.容差&#xff1a; 电阻…

VMware建立linux虚拟机

本文适用于初学者&#xff0c;帮助初学者学习如何创建虚拟机&#xff0c;了解在创建过程中各个选项的含义。 环境如下&#xff1a; CentOS版本&#xff1a; CentOS 7.9&#xff08;2009&#xff09; 软件&#xff1a; VMware Workstation 17 Pro 17.5.0 build-22583795 1.配…

DeepSeek+Kimi 一键生成100种PPT

一 简介 PPT在工作中经常用到&#xff0c;无论是给老板汇报&#xff0c;还是同事、朋友之间的分享&#xff0c;或是去见投资人:) &#xff0c;都离不开它&#xff0c;然而写PPT经常让人感觉不胜其烦&#xff0c;无论是逻辑的展开、还是页面的布局、字体、配图&#xff0c;都像个…

循环神经网络rnn

1.了解词嵌入层的作用 2.了解循环网络层的作用 1.词嵌入层 将文本进行数值化,词嵌入层首先会根据输入的词的数量构建一个词向量矩阵&#xff0c;例如:我们有 100 个词&#xff0c;每个词希望转换成 128 维度的向量&#xff0c;那么构建的矩阵形状即为:100*128&#xff0c;输入…

雷池WAF动态防护技术实测

作者&#xff1b; Hacker / 0xh4ck3r 介绍 长亭雷池&#xff08;SafeLine&#xff09;是由北京长亭科技有限公司耗时近10年研发并推出的Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;其核心检测能力由智能语义分析算法驱动。雷池旨在为用户提供高质量的Web攻击防护、…

MATLAB应用介绍

MATLAB 数据分析 MATLAB 在数据分析方面的强大功能和优势&#xff0c;涵盖数据处理、分析、可视化、结果分享等多个环节&#xff0c;为工程师和科学家提供了全面的数据分析解决方案。 MATLAB 数据分析功能概述&#xff1a;工程师和科学家利用 MATLAB 整理、清理和分析来自气候学…

玩机日记 14 飞牛fnOS部署qBittorrent、AList、Jellyfin,实现下载、存取、刮削、观看一体的家庭影音中心

目录 观前提示&#xff1a; 1、前置条件 2、安装配置qBittorrent 简单配置 延时启动 配置AList的离线下载 配置qBittorrent不走代理 3、安装配置Jellyfin 建立媒体库目录 安装Jellyfin 配置Jellyfin媒体库 打开硬件解码 启用备用字体 配置Jellyfin的SSL 观前提示&…

基于全志T527+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

T527FPGA方案&#xff1a; 内置8核Cortex-A55&#xff0c;主频最高1.8Ghz&#xff1b;G57 MC1 GPU&#xff0c;2Tops算力NPU&#xff1b;同时内置1RISC-V2DSP核&#xff0c;拥有4K高清解码强大性能&#xff0c;配备多种显示接口与2千兆以太网口&#xff0c;4RS485&#xff08;…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区&#xff0c;使用前需先按Fn键 1.1、功能区 ESC&#xff1a;退出 F1&#xff1a;显示帮助信息 F2&#xff1a;重命名 F4&#xff1a;重复上一步操作 F5&#xff1a;刷新网页 …

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统&#xff0c;作者为蒲乐天&#xff0c;后端基于puyuetianPHP框架驱动&#xff0c;前端基于 puyuetianUI框架驱动&#xff0c;默认编辑器为puyuetianEditor富文本编辑器&#xff0c;其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

基于 C++ Qt 的 Fluent Design 组件库 QFluentWidgets

简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库&#xff0c;内置超过 150 个开箱即用的 Fluent Designer 组件&#xff0c;支持亮暗主题无缝切换和自定义主题色。 编译示例 以 Qt5 为例&#xff08;Qt6 也支持&#xff09;&#xff0c;将 libQFluentWidgets.d…

架构思维:分布式缓存_提升系统性能的关键手段(上)

文章目录 引言一、缓存的特点二、缓存的关键指标-命中率三、缓存的使用场景四、缓存的种类与应用五、缓存存储&#xff1a;哈希表实现六、分布式缓存与一致性哈希七、优化缓存性能总结 引言 分布式架构 缓存技术作为架构设计中重要的性能优化手段&#xff0c;在现代互联网系统…

C# 打印Word文档 – 4种打印方法

Word文档是日常办公和学习中不可或缺的一部分。比如在商务往来中&#xff0c;经常需要打印 Word 文档用于撰写和传递正式的商务信函、合作协议、项目提案等。打印出来的文档便于双方签字盖章&#xff0c;具有法律效力和正式性。本文将提供以下4种通过C# 打印Word文档的方法&…

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷&#xff0c;从简单的文档共享系统到如今复杂、交互式、数据驱动的平台&#xff0c;经历了多个重要阶段。 一、起源与初期发展&#xff08;1989-1995年&#xff09; Web的诞生&#xff1a; 1989年&#xff0c;欧洲…

【Matlab仿真】Matlab Function中如何使用静态变量?

背景 根据Simulink的运行机制&#xff0c;每个采样点会调用一次MATLAB Function的函数&#xff0c;两次调用之间&#xff0c;同一个变量的前次计算的终值如何传递到当前计算周期来&#xff1f;其实可以使用persistent变量实现函数退出和进入时内部变量值的保持。 persistent变…