四、二叉树基本操作

实验四 二叉树基本操作的实现 实现链式储存创建,递归先序 中序 后序遍历,叶子结点数,数的结点总数,交换左右子树 #include #include #include int cnt; //结点声明,数据域 左子树 右子树 typedef struct BiNode { char data; struct BiNode *lchild,*rchild; }BiNode,*BiTree; //创建 阅读详情

🚀 一、树形结构

🌟 1.1 什么是树?

==此处添加树形结构图==
树形结构是一种非线性的数据结构,它有以下特点:

  • 有一个特殊的节点:根节点,根节点没有前驱节点。
  • 除根节点外,其余节点被分成 M(M > 0)个互不相交的集合,其中每一个集合又是一颗与树类似的子树。
  • 树是递归定义的。

🌟 1. 2 重要概念

  1. 节点的度:一个节点含有的子树的个数。
  2. 树的度:一棵树中,最大的节点的度称为树的度。
  3. 叶子节点:度为 0 的节点称为叶子节点。
  4. 双亲节点或父节点:若一个节点含有字节点,则这个节点称为它的子节点的父节点。
  5. 子节点:一个节点含有的子树的根节点为该节点的子节点。
  6. 节点的层次:从根节点开始定义,根节点为第一层,以此类推。
  7. 树的深度:树中节点的最大层次。

🚀 二、二叉树

==二叉树图片==

🌟 2.1 概念

一棵二叉树是节点的有限集合,该集合或为空,或为一个根节点加上两颗分别称为左子树和右子树的二叉树组成。

二叉树的特点:

  • 每个节点最多有两颗子树,二叉树不存在度大于 2 的节点。
  • 二叉树的子树有左右之分,不能颠倒,因为二叉树是有序树。

🌟 2.2 两种特殊二叉树

  1. 满二叉树:一个二叉树,每层的节点数都达到最大值,则这个树就是满二叉树。即如果一个二叉树的层数为 K ,且节点总数为 2^K - 1 ,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是一种效率很高的数据结构。对于深度为 K 的,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 K 的满二叉树中编号 1 到 n 的节点的位置一一对应时才称为完全二叉树。完全二叉树的节点按下标依次存放且连续。满二叉树是特殊的完全二叉树。

在这里插入图片描述

🌟 2.3 二叉树的性质(重要)

  1. 若规定根节点层数为 1,则一棵非空二叉树的第 i 层上最多有 2^(i-1) 个节点。
  2. 若规定只有根节点的二叉树的深度为 1,则深度为 K 的二叉树的最大节点数是 2^K - 1。
  3. 对任一棵二叉树,如果其叶节点个数为 n0 ,度为 2 的非叶节点个数为 n2 ,则有 n0 = n2 + 1。
  4. 具有 n 个节点的二叉树的深度 K 为 log( n+1 ) (以 2 为底)向上取整。
  5. 对于 n 个节点的完全二叉树,按照从上至下从左至右的顺序对所有节点从 0 开始编号,则对于序号为 i 的节点有:
    • 若 i > 0 ,则父节点为 ( i-1 ) / 2。否则无父节点。
    • 若 2i +1 < n ,则左孩子为 2i + 1。
    • 若 2i + 2 < n,则右孩子为 2i + 2。

🌟 2.4 二叉树的存储

二叉树的存储结构分为顺序存储和链式存储。

  • 堆主要采用顺序结构存储。
  • 二叉树主要采用链式结构存储。

二叉树的链式存储是通过一个个的节点引用起来的,常见的有 孩子兄弟表示法 和 孩子双亲表示法。

// 链式结构下二叉树节点
// 孩子表示法
class Node {
	int val;	// 存储的数据
	Node left;	// 左孩子的引用
	Node right;	// 右孩子的引用
}

// 孩子双亲表示法
// AVL树、B-树、红黑树等树形结构会用到这种方法。
class Node{
	int val;	// 存储的数据
	Node left;	// 左孩子的引用
	Node right;	// 右孩子的引用
	Node parent;// 当前节点的根节点
}

🚀 三、二叉树的基本操作

🌟 3.1 构建二叉树说明

在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。先在下面手动快速创建一棵简单二叉树。

/**
 *  先创建一棵二叉树
 */
public TreeNode createTree(){
    TreeNode root = new TreeNode('A');
    TreeNode B = new TreeNode('B');
    TreeNode C = new TreeNode('C');
    TreeNode D = new TreeNode('D');
    TreeNode E = new TreeNode('E');
    TreeNode F = new TreeNode('F');
    TreeNode G = new TreeNode('G');
    TreeNode H = new TreeNode('H');
    
    root.left = B;
    root.right = C;
    B.left = D;
    B.right = E;
    C.left = F;
    C.right = G;
    E.right = H;
    
    return root;
}

上述代码并不是创建二叉树的真正方式,只是为了方便学习,快速搭建出来的。

🌟 3.2 二叉树的遍历

3.2.1 前中后序遍历

二叉树的遍历指沿着某条搜索路线,依次对树中每个节点做且仅做一次访问。遍历是二叉树最重要的操作之一。 二叉树的遍历主要有以下几种:

  1. 前序遍历:根节点 => 根的左子树 => 根的右子树
  2. 中序遍历:根的左子树 => 根节点 => 根的右子树
  3. 后序遍历:根的左子树 => 根的右子树 => 根节点
    在这里插入图片描述
/**
 *  前序遍历
 */
public void preOrder(TreeNode root){
    if(root == null){
        return ;
    }
    System.out.print(root.val + " ");
    preOrder(root.left);
    preOrder(root.right);
}
/**
 * 中序遍历
 * @param root
 */
public void inOrder(TreeNode root){
    if(root == null){
        return ;
    }
    inOrder(root.left);
    System.out.print(root.val + " ");
    inOrder(root.right);
}
/**
 * 后序遍历
 * @param root
 */
public void postOrder(TreeNode root){
    if(root == null){
        return ;
    }
    postOrder(root.left);
    postOrder(root.right);
    System.out.print(root.val + " ");
}

在这里插入图片描述

3.2.2 二叉树的层序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
在这里插入图片描述

/**
 * 二叉树的层序遍历
 * 需要使用到 队列 的数据结构
 *
 * @param root
 */
public void levelOrder(TreeNode root){
    // 先创建一个队列,并把根节点放入队列
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    // 循环条件是,队列里还有元素,即层序遍历还未完成。
    while(!queue.isEmpty()){
        // 弹出队列头节点,
        TreeNode top = queue.poll();
        System.out.print(top.val + " ");
        
        // 如果该节点的左子节点不为空,入队列 
        if(top.left != null){
            queue.offer(top.left);
        }
        // 如果该节点的右子节点不为空,入队列 
        if(top.right != null){
            queue.offer(top.right);
        }
    }
}

在这里插入图片描述

🌟 3.3 二叉树的基本操作

  1. 获取节点总数。
  2. 获取叶子节点总数
  3. 求第 K 层节点总数
  4. 获取二叉树高度
  5. 二叉树查找元素
/**
 *  遍历思路,获取节点个数
 */
static int size = 0;
public void getSize1(TreeNode root){
    if(root == null){
        return;
    }
    size++;
    getSize1(root.left);
    getSize1(root.right);
}

/**
 *  子问题思路,获取节点个数
 * @param root
 * @return
 */
public int getSize2(TreeNode root){
    if(root == null){
        return 0;
    }
    return getSize2(root.left) + getSize2(root.right) + 1;
}


/**
 * 遍历思路,求叶子节点个数
 */
static int leafSize = 0;
public void getLeafSize1(TreeNode root){
    if(root == null){
        return;
    }
    if(root.left == null && root.right == null){
        leafSize++;
    }
    getLeafSize1(root.left);
    getLeafSize1(root.right);
}

/**
 * 子问题思路,获取叶子节点个数
 * @param root
 * @return
 */
public int getLeafSize2(TreeNode root){
    if(root == null){
        return 0;
    }
    if(root.left == null && root.right==null){
        return 1;
    }
    return getLeafSize2(root.left) + getLeafSize2(root.right);
}


/**
 *  求第 K 层节点总数,子问题思路
 * @param root
 * @return
 */
public int getKlevelSize(TreeNode root, int k){
    if(root == null){
        return 0;
    }
    if(k == 1){
        return 1;
    }
    return getKlevelSize(root.left,k-1) + getKlevelSize(root.right,k-1);
}


/**
 * 获取二叉树高度
 *
 * @param root
 * @return
 */
public int getHeight(TreeNode root){
    if(root == null){
        return 0;
    }
    return Math.max(getHeight(root.left),getHeight(root.right))+1;
}


/**
 * 查找元素,根 => 左 => 右 的顺序进行查找
 * @param root
 * @param val
 * @return
 */
public TreeNode find(TreeNode root, char val){
    if(root == null){
        return null;
    }
    if(root.val == val){
        return root;
    }
    return find(root.left,val) == null ? find(root.right,val) : find(root.left,val);
}
5-DOF机械臂课程设计(一)之正逆运动学 文章目录基本要求基本概念关节坐标系的建立正运动学求解DH参数表的建立逆运动学求解多解下解的选取源码下载后续 基本要求 ​ 开发上位机程序,要求有良好的界面,能提供关节空间下和笛卡尔坐 标下表示的目标位姿点和中间若干经过点的输入功能,进行轨迹规划, 并控制机械臂沿轨迹运动,最终完成目标抓取的任务。 基本概念 连杆长度 :2个相邻关节轴线之间的距离 连杆扭角 :2个相邻关节轴线之间的角度 连杆偏距 :2个关节坐标系的X轴之间的距离 关节角度 :关节变量 计算时需要加初始角度偏移 关节坐标系的建立 ​ 根据《机 阅读详情

相关推荐

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 209

二叉树的构建

二叉树是一种非常重要的数据结构。本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历、中序遍历、后序遍历、层次遍历),二叉搜索树的构造等。

li123128的博客 3648

从零到一:RK3588平台上的星闪模块驱动移植全解析

本文详细解析了在RK3588平台上移植UB37星闪模块驱动的完整流程,涵盖内核配置、设备树适配、驱动编译、功能测试等关键步骤。通过实践指导,帮助开发者掌握星闪技术在嵌入式系统中的集成与应用,提升无线通信模块的开发效率。

qsc90123456的博客 335

二叉树基本操作

二叉树的先序,中序,后序遍历的递归与非递归,二叉排序树的建立,添加,删除,满二叉树,完全二叉树的判断

青耕_的博客 1901

本科双非的计算机考研择校注意点——经验贴

一战一志愿上岸某211的电子信息专硕。之前在某乎也发过帖子。但现在用优快云,所以把相关的心得再发出来仅供大家参考。 首先,我认为最重要的是你为什么要考研? 不管你是为了混一个文凭将来好进大厂,还是为了真正搞学术或者学知识,你要知道你自己的目标,只有坚定自己的目标,才有动力去走完这段复习的历程。真正的考研,是很苦的。如果你是为了逃避大四面临的就业才选择考研,并且还浑浑噩噩不当回事,那我劝你放弃,不如踏踏实实学点技术去找实习。那从我自己出发,我是认为自己本科双非院校且自己四年间没有学到什么专业方面的技能,

m0_56698268的博客 3164

实现labelme批量json_to_dataset方法

labelme可以帮助我们快速的实现Mask-RCNN中数据集json文件的生成,然而还需要我们进一步的将json转成dataset,可以直接在cmd中执行labelme_json_to_dataset.exe C:\Users\Administrator\Desktop\total\1.json(路径),但是这个过程需要我们一个json文件的生成,过程很慢。 一、打开abelm...

简简单单 5万+

二叉树的基本操作

从根开始定义起,根为第1层,根的子节点为第2层,以此类推。:若一个节点含有子节点,则这个节点称为其子节点的父节点。:以某节点为根的子树中任一节点都称为该节点的子孙。:一个节点含有的子树的根节点称为该节点的子节点。:一个节点含有的子树的个数称为该节点的度。:具有相同父节点的节点互称为兄弟节点。:一棵树中,最大的节点的度称为树的度。:从根到该节点所经分支上的所有节点。:双亲在同一层的节点互为堂兄弟。:度为0的节点称为叶节点。非终端节点或分支节点。:树中节点的最大层次。

m0_63783532的博客 2044

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1754

【数据结构】二叉树详解及基本操作

【数据结构】二叉树详解及基本操作

weixin_46088156的博客 3653

工程师职级胜任力框架

一、前言 尽管这些年国内的IT行业发展迅速,但是仍然欠缺一套比较综合性的面向工程师的职级胜任力框架,造成国内很多工程师大都一心只想成为技术大牛,而忽视了自己全方位的工程师职业素养和能力的培养。 最近我有幸读到了Circle CI公司分享的工程胜任力矩阵,发现这份文档就是一份比较贴合互联网研发型企业的工程师职级胜任力框架,于是我在它的基础上,重新整理出了一份更适合国内工程师阅读的《工程师职级胜任力框架》,并把它分享在波波的github站点上,希望这份文档对工程师的职业开发和成长有帮助。注,Circle CI.

架构师波波的专栏 6324

最近腾讯手机管家a.gray.Bulimia.a病毒提示决解方案

仅供参考(个人问题已解决 未申诉) 用户反馈app提示病毒图如下 然后下载生产包去https://www.virustotal.com/gui/这个网站去检测 果真提示病毒 重新加版本 打了个包 未加固 检测没问有问题 同一个包用360加固之后再检测有问题 ,但是没有a.gray.Bulimia.a报病毒 然后再用应用宝加固检测也没问题,个人以前都是用360加固的,很尴尬啊 最重要的一点的是,更新一个版本号,其余的啥都没改,更新替换手机的原来版本app,腾讯手机.

村头那抠脚大叔的专栏 3万+

实验四 二叉树的基本操作

实验四 二叉树的基本操作 一、实验目的 1.掌握二叉树的定义; 2.掌握二叉树的基本操作,如二叉树的建立、遍历、结点个数统计、树的深度等。 二、实验内容 用递归的方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树(算法5.3); 2.输出二叉树的中序遍历结果(算法5.1或讲稿); 3.输出二叉树的前序遍历结果(见讲稿); 4.输出二叉树的后序遍历结果(见讲稿); 5.计算二叉树的深度(算法5.5); 6.统计二叉树的结点个数(算法5.6). 三、实验环境 Dev C++

a1799069885的博客 8412

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 42

数据结构实验④:二叉树的基本操作

如果你喜欢这篇文章的话,请给作者点赞哟,你的支持是我不断前进的动力。 因为作者能力水平有限,欢迎各位大佬指导。 一、题目描述 用递归的方法实现以下算法。 1.以二叉链表表示二叉树,建立一棵二叉树; 2.输出二叉树的先序、中序和后序遍历结果; 3.计算二叉树的深度; 二、解题思路 1.使用二叉树的二叉链表存储表示,并初始化,让二叉树T的左右孩子均为0。 2.采用先序遍历的方法建立二叉树,如果输入的空格则表示下一节点为空。 3.使用3个算法实现二叉树的先序,中序,后序遍历,其访问的顺序分别为

憨憨猿学编程 5083

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java~数据结构(四)~二叉树(什么是树&树一些概念&二叉树&二叉树的基本操作和前中后遍历)

树的基础知识 二叉树 两种特殊的二叉树 如何储存一棵二叉树 二叉树的基本操作 二叉树的遍历 树的基础知识 什么是树? 树是一种数据结构。由n个节点(n>=0)个有限节点组成一个具有层次关系的集合。 树是递归定义的。

zxc的博客 606

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构实验(四)二叉树的基本操作

【代码】数据结构实验(四)二叉树的基本操作。

2201_75556700的博客 340

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

小白都能看懂的二叉树基本操作(四):平衡二叉树、完全二叉树的判断

二叉树常见题目种类繁多,但是万变不离其宗。 二叉树,以及其他变种树的操作,确实在笔试面试中挺常见。这也属于典型的“面试造航母,工作拧螺丝”。不过熟悉掌握二叉树,对工作以及逻辑思维还是很有帮助的。 今天看一下平衡二叉树和完全二叉树的判断。 一、平衡二叉树 平衡二叉树是指,每一个父节点的左右子树高度差的绝对值小于等于1,这样的二叉树叫平衡二叉树。 请出我们的演员树: 如上图,这棵树就是一颗平衡二叉树。应为每个节点的左右子树的高度差的绝对值都小于等...

zhanglu_1024的博客 713

C++ 二叉树的基本操作

一:目的 用C++实现二叉树的基本操作,建立和遍历; 二:介绍 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历。 它的前序遍历顺序为:ABDGHCEIF(规则是先是

nichengwuxiao的博客 1万+

二叉树的基本操作(C语言实现)

#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; //二叉树的节点定义 typedef struct TreeNode { char ch; //数据域 struct TreeNode *lchild; //左孩子 struct TreeNode *rchild; //右孩子 }BTNode...

Touch的博客 571

初识二叉树和二叉树的基本操作

子树是不相交的;除了根结点外,每个结点有且仅有一个父结点一棵N个结点的树有N-1条边。非树:或者为空或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

2301_77572338的博客 2036

二叉树的存储及基本操作

学院 信息工程学院 班级 网络工程 课程名称 数据结构实验 学号 1801140006 姓名 肖溪 实验成绩 指导教师 代文征 实验题目: 二叉树的存储及基本操作 一、实验目的 1、掌握二叉树的二叉链表存储实现; 2、掌握在二叉链表上的基本操作; 3、掌握二叉排序树的二叉链表存储实现; 4、掌握二叉排序树的在二叉链表上的基本操作。 二、实验作业 在给出部分代码的基础上完成: 1、已知,二叉树中的元素是整型的,在给出部分参考代码的基础上完成: 在二叉链表存储体上实现二叉树的存储

Sum 2376

实验五 二叉树基本操作的编程实现

二叉树基本操作的编程实现(2学时,验证型),掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。二叉树由根节点、左子树和右子树组成,而左子树和右子树也是一棵二叉树,它们的定义与原二叉树的定义相同,因此可以使用递归的方式来定义二叉树。=',') //输入数据不为逗号,表示不为虚结点,否则为虚结点。case 3:printf("二叉树中序遍历结果为:\n");case 4:printf("二叉树后序遍历结果为:\n");

Htw18705081160的博客 1583
上一篇: 二、Java 链表和 LinkedList
下一篇: 三、Java 栈和队列详解
江初。
博客等级 码龄5年 7粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值