浅谈二叉树

一、树(Tree)

树形结构是一种非线性数据结构;树是以分支关系定义的层次结构。

问题来了,什么是线性数据结构?什么是非线性数据结构?
线性结构是一组有序数据元素的集合,比如数组、栈、队列,除了第一个元素和最后一个元素以外,其他元素都是首尾相连的。
非线性结构中各个数据元素没有对应的顺序,每个数据元素都可能和零个或多个数据元素发生关系,典型的非线性结构包括二维数组、树、图。

生活中比较常见的树形结构:企业组织层级架构、计算机文件系统、族谱等。

二、二叉树(Binary Tree)

二叉树是一种特殊的树形结构,每个节点(Node)最多只能有两棵子树(SubTree),子树有左右之分,顺序不能任意颠倒。

那么二叉树有何特点呢?
可以高效的插入、查找和删除数据。


三、二叉查找树(Binary Search Tree)的实现

二叉查找树(BST)是一种特殊的二叉树,相对较小的值保存在左子树中,较大的值保存在右子树中。

首先定义节点,节点是组成二叉树的基本单元。(以下代码均用JavaScript实现)

function Node(data, left, right) {
  this.data = data; // 节点值
  this.left = left;  // 左子树(左节点)
  this.right = right;  // 右子树(右节点)
  this.show = show;  // 显示当前节点值
}

function show() {
  return this.data;
}


其次定义BST类,包含:
1.一个根节点,初始化为null
2.向BST对象中插入节点的insert方法

function BST() {
  this.root = null;
  this.insert = insert;
}

function insert(data) {
  var n = new Node(data, null, null); 
  
  if (this.root === null) { this.root = n; } else { var current = this.root; var parent; while (true) { parent = current; if (data < parent.data) { current = current.left; if (current === null) { parent.left = n; break; } } else { current = current.right; if (current === null) { parent.right = n; break; } } } } }


遍历二叉查找树
所谓遍历,即按照某种顺序访问树中每个节点,使得每个节点都被访问一次,且仅被访问一次。
二叉树由三个基本单元组成——根节点、左节点和右节点,所以遍历整个二叉树,也就可以看作依次遍历这三部分。
一般遵循先左后右的原则,所以常见的遍历方案有前序遍历(根左右)、中序遍历(左根右)和后序遍历(左右根)。

前序遍历

function preOrder(node) {
  if (!(node === null)) {
    console.log(node.show());
    preOrder(node.left);
    preOrder(node.right);
  }
}

 

中序遍历

function inOrder(node) {
  if (!(node === null)) {
    inOrder(node.left);
    console.log(node.show());
    inOrder(node.right);
  }
}

 

后序遍历

function postOrder(node){
  if (!(node ===null)) {
    postOrder(node.left);
    postOrder(node.right);
    console.log(node.show());
  }
}

 

以上实现基于递归算法


下面介绍非递归算法

非递归算法需要用到另外一种数据结构——栈,本篇对栈不进行展开叙述,只贴出简单的JavaScript实现

function Stack() {
  this.dataStore = [];
  this.top = 0;
  this.push = push; // 入栈 
  this.pop = pop; // 出栈
  this.peek = peek; // 返回栈顶元素
  this.clear = clear; // 清空栈
  this.length = length; // 返回栈内元素个数
}

function push(element) {
  this.dataStore[this.top++] = element; } function pop() { return this.dataStore[--this.top]; } function peek() { return this.dataStore[this.top - 1]; } function clear() { this.top = 0; } function length() { return this.top; }

 

前序遍历非递归算法

思路:

1.当前节点为根节点,根节点不为空且栈不为空

2.当前节点不为空,访问当前节点,当前节点入栈,访问当前节点左子树

3.否则,节点出栈,当前节点指向出栈节点右子树

function preOrder_Stack(root) {
  var result = [];
  var stack = new Stack();
  var p = root;

  while (stack.length() || p !== null) {
    if (p !== null) { stack.push(p); result.push(p.data); // 在遍历左子树之前加入根元素 p = p.left; } else { var node = stack.pop(); p = node.right; } } return result; }

 

中序遍历非递归算法

思路:

1.当前节点为根节点,根节点不为空且栈不为空

2.当前节点不为空,当前节点入栈,访问当前节点左子树

3.否则,节点出栈,访问出栈节点,当前节点指向出栈节点右子树

function inOrder_Stack(root) {
  var result = [];
  var stack = new Stack();
  var p = root;

  while (stack.length() || p !== null) {
    if (p !== null) { stack.push(p); p = p.left; } else { var node = stack.pop(); result.push(node.data); // 遍历完左子树之后加入根元素 p = node.right; } } return result; }

 

后序遍历非递归算法

思路:

后序遍历访问顺序为左右根,可以换个思路,按照根右左的顺序访问,然后利用数组unshift方法实现结果反转,这样就转化成根右左的遍历算法

1.当前节点为根节点,根节点不为空且栈不为空

2.当前节点不为空,访问当前节点,当前节点入栈,访问当前节点右子树

3.否则,节点出栈,当前节点指向出栈节点左子树

function postOrder_Stack(root) {
  var result = [];
  var stack = new Stack();
  var p = root;

  while (stack.length() || p !== null) {
    if (p !== null) { stack.push(p); result.unshift(p.data); p = p.right; } else { var node = stack.pop(); p = node.left; } } return result; }


四、备注

1.第一次写文,肯定有诸多不足,请多多指教,多多批评!

2.花时间写这篇文章的时候,才真的体会到其中的不易,向各位前辈致敬!

3.参考书目:

[美]Michael McMillan.数据结构与算法JavaScript描述[M]王群锋、杜欢译.北京:人民邮电出版社,2014

严蔚敏、吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,1997

4.参考技术博客:

线性结构和非线性结构 - 优快云博客​blog.youkuaiyun.com
 
 

转载于:https://www.cnblogs.com/ShawnCui/p/9405530.html

教程: 将 SolidWorks 设计导出为 ROS 的 URDF 请按照以下步骤应用自定义徽标纹理:创建徽标材质文件:techniquepass材质名称:测试/材质颜色属性:环境、漫反射、镜面和发射都设置为白色(1 1 1 1),这意味着该材质看起来完全是白色的。纹理 在表面应用纹理图像 logo.png。将材质文件复制到 gazebo matrial:复制徽标图像:将 “徽标 ”替换为机器人上徽标所在位置的适当参考值。按照以上步骤,您就可以在 Gazebo 中为机器人添加自定义材质和纹理,包括徽标。 阅读详情

相关推荐

GprMax正演模拟:为什么你的反射波‘消失’了?可能是直达波在捣鬼(附Python后处理脚本)

本文深入探讨了GprMax正演模拟中反射波信号被直达波淹没的现象,并提供了Python后处理脚本的实战指南。通过时域置零、自适应增益控制、频域滤波等多种技术,有效增强反射波信号,帮助用户解决探地雷达模拟中的常见问题。文章还包含详细的代码示例和效果评估方法,适合GPR数据处理的研究人员和工程师参考。

weixin_29305313的博客 232

二叉树(Binary Tree)

二叉树是研究树型结构的基本类型。任意一棵树均可转换为二叉树(左孩子右兄弟)。因为森林是由树组成,所以也可使用二叉树表示森林(多个二叉树表示)。

云原生Java Web领域技术博客 3685

【论文速读】MLDT:基于开源大语言模型的复杂长时机器人任务规划多层次分解方法

—在数据驱动的人工智能技术领域,开源大语言模型(LLMs)在机器人任务规划中的应用是一个重要的里程碑。近期基于开源大语言模型的机器人任务规划方法通常利用大量的任务规划数据集来提升模型的规划能力。虽然这些方法展现出了一定的前景,但它们在处理复杂长时任务时存在困难,因为这类任务需要理解更多的上下文信息并生成更长的动作序列。本文提出多层次分解任务规划方法(MLDT)来解决这一局限性。该方法创新性地在目标级、任务级和动作级对任务进行分解,以应对复杂长时任务带来的挑战。

muyulingfengye的博客 1646

二叉树前序遍历python输出_python先序遍历二叉树问题

问题如何遍历一个二叉树遍历二叉树就是访问二叉树的每一个节点二叉树父结点下先左访问,先序遍历(根左右)例如:遍历以下的二叉树遍历结果:ABDECFPython代码示例# !/usr/bin/env python# -*-encoding: utf-8-*-# author:LiYanwei# version:0.1class TreeNode(object):'''二叉树类'''def __init...

weixin_39955149的博客 452

OnePose++: Keypoint-Free One-Shot Object Pose Estimation without CAD Models

算法:首先采用LoFTR的细匹配模块,将粗匹配点周围的小窗口内,通过对比特征找到最相似的位置,细化当前特征点的位置。算法:PnP算法,利用3D点和2D投影点的对应关系,计算相机相对于物体的6D姿态(位置朝向)。算法:使用COLMAP,对2D粗匹配对(不依赖传统关键点匹配)进行特征轨迹计算并生成半稠密点云,每个3D点包含坐标和对应的2D投影点。算法:LoFTR粗匹配模块,将每一个像素点视为伪关键点,生成半稠密的2D匹配对。输入:优化后的3D、当前视图的2D特征点。输出:粗半稠密点云以及物体的特征轨迹。

雨落倾城的博客 886

在Ubuntu 18下安装SIMULIA Abaqus 2020

参考资料: https://github.com/imirzov/Install-Abaqus-2019-on-Ubuntu-18.04-LTS 安装环境: Ubuntu 18.4 LTS 软件版本: SIMULIA for Linux 2020 1 准备 安装光盘及破解文件 解压光盘至一目录,不能挂载,因为要修改文件内容 /home/sunwk/Downloads/abaqus2020 更改文件权限为最大 sudo chmod -R 777 abaqus2020/ * 复制libpng12

oak619的博客 1万+

二叉树的基础知识(定义和性质、存储结构、遍历)

目录一、二叉树的定义和性质1.1 二叉树的定义1.2 二叉树的性质二、二叉树的存储结构 2.1 顺序存储结构 ​2.2 链式存储结构三、二叉树的遍历 3.1 DLR先序遍历3.2 LDR中序遍历3.3 LRD后序遍历极端情况:如图所示: 如图所示: 三、二叉树的遍历 二叉树的基本结构:...

狂放不羁霸的博客 729

弱小目标检测跟踪算法研究(5) 基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制

基于顶帽变换(Top_hat)算法的红外弱小目标检测之背景抑制1. 前言2. 顶帽变换(Top_hat)算法3. Matlab仿真4. 小结 1. 前言 红外图像中的弱小目标,目标属性包涵“弱"和“小’’两个方面:“弱’’是指目标在红外波长上所表现出来的强度,具体反映到所拍摄的红外图像上,就是指目标的灰度值;而“小’’是指目标的尺寸大小,也就是前面所述的成像面积很小,反映到红外图像上就是指目标所占的像素数目很少。 SPIE国际光学工程学会(Societyof Photo一0ptical Instrument

sinat_34897952的博客 5293

树与二叉树(二)

遍历二叉树 遍历二叉树是指按某条搜索路径巡防树中的每个节点,使得每个节点均被访问一次,而且仅被访问一次。 由二叉树的递归定义可知,二叉树由三个基本单元构成:根节点、左子树和右子树。如果用L、D、R分别表示遍历左子树、访问根节点和遍历右子树再限定先左后右,则有以下3种情况:先序遍历(DLR)、中序遍历(LDR)、后序遍历(LRD)。其操作定义如下: 1.先序遍历二叉树: 若二叉树为空,则操作为空,否则: 1>访问根节点; 2>先序遍历左子树; 3>先序遍历右子树; 2.中序遍

m0_64109217的博客 1034

(5)ModalAI VOXL2

Ardupilot官网关于《Non-GPS navigation》的翻译 —《(5) ModalAI VOXL2》。

无人机开发(开源Ardupilot) 1万+

【大模型学习】第二十四章 生成式人工智能(GAI)简介

‌的AI技术,其核心目标是通过学习数据中的规律,生成与训练数据类似但全新的文本、图像、音频、视频甚至代码。生成式人工智能(GAI)是一类能够‌。

以实战经验介绍行业知识 1637

浅谈二叉树总结

二叉树(binary tree)是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。/* 二叉树节点结构体 */int val;// 节点值// 左子节点指针// 右子节点指针每个节点都有两个引用(指针),分别指向左子节点(left-child node)和右子节点(right-child node),该节点被称为这两个子节点的父节点(parent node)。

jax2730的博客 1279

.net core 下的PostgreSQL 异常排查—— Exception while reading from stream (0x80004005)

最近以PostgreSQL为存储介质,实现了分布式缓存的一个组件开发,在经过开发环境的测试后,顺利推送到产品组的手里,经过开发环境的验证后,终于发布到测试环境了,但问题来了,产品组反应频繁出现访问异常,返回的信息大致是:Exception while reading from stream … (0x80004005) ????欢迎点赞 :???? 收藏 ⭐留言 ???? 如有错误敬请指正,赐人玫瑰,手留余香! ????本文作者:由webmote 原创,首发于 【优快云】 ????作者格言: 生活在

网尘的技术专栏 5842

树——二叉树浅谈

树形结构——二叉树 二叉树顾名思义就是有两个分支的树,用数据结构的概念翻译过来就是每个结点最多只有两个孩子(left &amp; right)即最多只有两棵子树,每个结点的度最大为2,不存在大于2的结点,它是一颗有序树。 ####概念 一棵二叉树是节点的有限集合,该集合或者为空,或者由一个根结点加上两棵分别称为左子树和右子树的二叉树组成。 这个概念想到了什么呢?没错,是递归,二叉树就是由递归来构建...

sigma_inf的博客 791

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

浅谈 二叉树

           刚刚结束的上学期被编译原理折腾个半死,以为终于熬过去了,没有想到才过了几天,又要重新面对这个东西。其实,二叉树或者树,是一种很重要的数据结构,只要我想在这方面混,是逃不掉的。    不过,我已经决定了,不再像以前那样逃避放弃,我要好好的认真地学习。  既然决定了,就要做下去,半途而废不是我的风格。        二叉树,非线性的数据结构。顾名思义,最多两个叉。即,它的一个...

Eleanor的记录 144

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

YYB123789
博客等级 码龄10年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值