二叉树算法

2023-10-27

每日一句:少年就是少年,他们看春风不喜,看夏蝉不烦,看秋风不悲,看冬雪不叹,看满身富贵懒察觉,看不公不允敢面对。只因他们是少年!

目录

用递归和非递归两种方式实现二叉树的先序、中序、后序遍历

递归方法:

非递归方法:

 如何完成二叉树的宽度优先遍历(常见题目:求一棵二叉树的宽度)

 二叉树的相关概念及其实现判断

1.如何判断一棵二叉树是否是搜索二叉树?

2.如何判断一棵二叉树是完全二叉树?

3.如何判断一棵二叉树是否是满二叉树?

二叉递归套路:

判断满二叉树,用递归套路

给定两个二叉树的节点node1和node2,找到他们的最低公共祖先节点

在二叉树中找到一个节点的后继节点

【题目】现有一种新的二叉树节点类型如下:

Public class Node

{

public int Value;

Public Node left;

Public Node right;

Public Node parent;

Public Node(int val)

{value=val;}}

该结构比普通二叉树节点结构多了一个指向父节点的parent指针

假设有一棵Node类型的节点组成的二叉树,树中每个节点的parent指针都正确地指向自己的父节点,头节点的parent指向null

只给一个在二叉树中的某个节点Node,请实现返回node的后继节点的函数

二叉树的序列化和反序列化

 折纸问题

请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开

此时折痕是凹下去的,即折痕突起的方向指向纸条的背面,如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕,下折痕和上折痕

给定一个输入参数N,代表纸条都从下边向上方连续对折N次

请从上到下打印所有折痕的方向

例:N=1时,打印:down;N=2时,打印:down down up


二叉树

二叉树节点结构

Class Node<V>

{V value;

 Node left;

 Node right;

}

用递归和非递归两种方式实现二叉树的先序、中序、后序遍历

递归方法:

先序:

递归序加工过来,第一次来到一个节点时,打印,二、三两次来到的时候什么也不干

中序:

递归序加工过来,第二次来到一个节点时,打印,一、三两次来到的时候什么也不干

后序:

递归序加工过来,第三次来到一个节点时,打印,二、一两次来到的时候什么也不干

代码:

 

非递归方法:

先序:

把头节点放到栈里

从栈中弹出一个节点cur—>打印cur—>先右再左(如果有)—>周而复始

 

 

后序:

从栈中弹出一个节点cur—>cur放入收集栈—>先左再右—>周而复始

 

中序:

每棵子树,整棵树左边界进栈—>依次弹的过程中,打印—>对弹出节点右树,周而复始

代码:

 

 如何完成二叉树的宽度优先遍历(常见题目:求一棵二叉树的宽度)

二叉树的深度优先遍历为先序遍历

宽度遍历用队列,头部进、尾部出,先进先出

先把头节点放队列里,每次弹出就打印,先放左、再放右,周而复始

 

 

 

 二叉树的相关概念及其实现判断

1.如何判断一棵二叉树是否是搜索二叉树?

【搜索二叉树】:对于每一棵子树来说,左树节点都比它小,右树节点都比它大

 

 

2.如何判断一棵二叉树是完全二叉树?

【完全二叉树】:最后一层满或从左到右依次变满

判断方式:二叉树按宽度来遍历

依次遇到每个节点过程中,出现情况:

1) 遇到任何一个节点,如果有右孩子,没左孩子,直接返回false

2)在1)成立条件下,如果第一个左、右两孩子不双全,后续遇到所有皆为叶节点,否则false

  

 

3.如何判断一棵二叉树是否是满二叉树?

方法一:先求树的最大深度l,再统计树的节点个数N。满足N=2l-1,则为满二叉树

二叉递归套路:

 

判断是否为搜索二叉树,用递归套路——从左树要信息,从右树要信息,罗列可能性

 

 

 

递归套路可以解决一切树型DP问题

基于可以向左树要信息,右树要信息,罗列可能性,做全集搞递归结构,固定代码结构

判断满二叉树,用递归套路

  递归套路返回两个值:整棵树高度、节点个数

 

给定两个二叉树的节点node1和node2,找到他们的最低公共祖先节点

方法一:

查D、F的最低公共祖先节点

先把D、B、A放到一个set里,让F往上走,F不在set里,E也不在,B在,所以B为D、F的最低公共祖先

方法二:

两种情况:

  1. O1为O2的最低公共祖先或O2为O1的最低公共祖先
  2. O1、O2彼此不互为最低公共祖先

如果一个树既没有O1,也没有O2,返回null

A向右树要答案,返回null

A向左树要答案看B,B看D,D看左树得O1,D看右树得null

所以B左侧返回值O1,B右侧返回值O2,B返回自己

 

在二叉树中找到一个节点的后继节点

【题目】现有一种新的二叉树节点类型如下:

Public class Node

{

public int Value;

Public Node left;

Public Node right;

Public Node parent;

Public Node(int val)

{value=val;}
}

该结构比普通二叉树节点结构多了一个指向父节点的parent指针

假设有一棵Node类型的节点组成的二叉树,树中每个节点的parent指针都正确地指向自己的父节点,头节点的parent指向null

只给一个在二叉树中的某个节点Node,请实现返回node的后继节点的函数

方法一:

在二叉树的中序遍历的序列中,node的下一个节点叫作node的后继节点

后继节点就是中序遍历中,一个节点的下一个节点

代价高,要求遍历所有的节点,得到一个List,才能知道任何一个节点的后继,复杂度O(N)

 

方法二:

找x后继

  1. x有右树,则后继节点为右树上的最左节点
  2. x无右树,看往上走是不是父的左孩子,不是接着往上走,是的话,父为x的后继

 

 

 

二叉树的序列化和反序列化

就是内存里的一棵树如何变成字符串形式,又如何从字符串形式变成内存里的树

 

 折纸问题

请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开

此时折痕是凹下去的,即折痕突起的方向指向纸条的背面,如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕,下折痕和上折痕

给定一个输入参数N,代表纸条都从下边向上方连续对折N次

请从上到下打印所有折痕的方向

例:N=1时,打印:down;N=2时,打印:down down up

打印所有折痕方向为这棵二叉树中序遍历

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树算法 的相关文章

随机推荐

  • swagger主页访问报错500

    背景 有一天前端给我要接口文档 我给发了个接口文档路径 结果直接报错500 截图如下 原因分析 500报错 看后台日志 java lang NullPointerException null at springfox documentati
  • R语言之函数调用

    处理数据对象的实用函数 函 数 功 能 length object 显示对象中元素 成分的数量 dim object 显示对象的维度 str object 显示对象的结构 class object 显示对象的类型 mode object 显
  • 还在为数据清洗抓狂?这里有一个简单实用的清洗代码集

    选自towardsdatascience 作者 Admond Lee 机器之心编译 参与 Geek AI 张倩 数据清洗是数据科学家逃不掉的一份苦差事 为了让这项工作不那么痛苦 本文作者分享了自己的数据清洗代码集 现实世界中的数据通常质量不
  • 听说你还不知道什么是 python?带你深入理解什么是 python

    文章目录 前言 什么是python python的由来 我们为什么要学习python 帮助python学习的网站 前言 各位朋友们 大家好 在之后的时间里 我将陆续为大家分享我在python学习过程中学习到的知识点 如果你也对python感
  • 【随机过程】 17 -离散时间马氏链典型应用

    离散时间马尔科夫链的典型应用 文章目录 离散时间马尔科夫链的典型应用 0 概述 1 Page Rank 1 1 背景 1 2 模型建立 1 3 模型求解 2 MCMC 2 1 概述 2 2 实现思路 2 3 具体实现 2 3 1 第一步 细
  • Qt基础之五:使用invokeMethod异步调用函数

    在主线程中如果执行比较耗时的任务 但是又不想单独开子线程来处理 不妨试试Qt中提供QMetaObject invokeMethod方法 该方法支持函数的异步调用 这样就会在界面显示后去执行 而不会卡主主界面 QMetaObject invo
  • [linux-sd-webui]图生文,blip/deepbooru

    GitHub pharmapsychotic clip interrogator Image to prompt with BLIP and CLIPImage to prompt with BLIP and CLIP Contribute
  • 【hadoop学习之路】Spark-SQL 实验报告 RDD转DataFrame

    1 Spark SQL 基本操作 1 1 需求 将下列JSON格式数据复制到Linux系统中 并保存命名为employee json id 1 name Ella age 36 id 2 name Bob age 29 id 3 name
  • Pandas处理日期数据

    一 pandaas日期处理的作用 将2018 01 01 1 1 2018等多种日期格式映射成统一的格式对象 在该对象上提供强大的功能支持 几个概念 1 pd to datetime pandas的一个函数 能将字符串 列表 series变
  • 数据结构——个人学习笔记

    系列目录 数据结构第一章绪论 数据结构第二章线性表 文章目录 系列目录 2 1线性表的定义和特点 2 2线性表的操作定义 2 3线性表的顺序表示和实现 线性表的重要基本操作 1 初始化线性表 参数用指针 2 插入 新增 3 取值 4 查找
  • easy modbus tcp

    public static void Main string args ModbusClient modbusClient new ModbusClient 190 201 100 100 502 Ip Address and Port o
  • Android组件化和插件化的概念,android快速开发框架

    开发单个模块时可以共享资源和工具类 可以针对单个模块测试 开发调试时不需要对整个项目进行编译 多人合作时可以只关注自己的业务模块 把某一业务当成单一项目来开发 可以灵活的对业务模块进行组装和拆分 4 组件化开发的主要思路 就是将一个Modu
  • c++求行列式的值(全排列法)

    用全排列的方式求行列式的值 递归体现在全排列中 上代码 f函数是求行列式的值 include
  • flink中通过jdbc查询结果集使用 flink table api 创建临时视图

    1 maven依赖
  • [转]QNX_HMI_crank工程的系统移植

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 开发软件 Cr
  • python如何输出多个星号_如何使用python输出连续星号?

    小编依稀记得 自己初学编程时候 第一节课 老师就给我们演示了输出连续星号内容 那时候真感叹python的神奇 重温一遍这个内容 入门小伙伴们可以来看下啦 有关语法 用嵌套打印小星星 需求 在控制台连续输出五行 每一行星号的数量依次递增 使用
  • 如何从配置文件中获取属性

    在项目中添加了一个腾讯云的短信业务 领导说要我把这个项目整合到原本的业务中去 业务那么多 怎么搞 继续询问后得知 是整合到原本的短信业务中 原本用的短信业务是短信猫来发短信 问 需要前端加传的参数吗 答 不允许 继续询问得知 是要在配置文件
  • [转]Tangram框架应用开发的一般模式

    框架其实就是一种开发模式 用tangram框架开发应用程序意味着选择一种面向接口 模块化的开发方式 这和传统的Delphi应用程序开发方式有一定区别 对于刚刚接触框架的童鞋可能不知道如何下手 因此有必要把框架的一般开发方式说明一下 不过框架
  • 深入分析HBase Compaction机制

    Compaction介绍 Compaction是buffer gt flush gt merge的Log Structured Merge Tree模型的关键操作 主要起到如下几个作用 1 合并文件 2 清除删除 过期 多余版本的数据 3
  • 二叉树算法

    每日一句 少年就是少年 他们看春风不喜 看夏蝉不烦 看秋风不悲 看冬雪不叹 看满身富贵懒察觉 看不公不允敢面对 只因他们是少年 目录 用递归和非递归两种方式实现二叉树的先序 中序 后序遍历 递归方法 非递归方法 如何完成二叉树的宽度优先遍历