二叉树

【数据结构】二叉树详解 树是一种非线性的数据结构,是由多个节点组成的有层次关系的集合,看起来就像一颗倒挂的树,如下图:树中有一个节点没有前驱节点,这个节点称为根节点除根节点外,其余的节点又可以看成多个互不相交的集合,每一个集合就是一颗子树。 阅读详情

二叉树的优势

       在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。

二叉树的构成

      二叉树由节点(node)和边组成。节点分为根节点、父节点、子节点。如下图所示:

这里写图片描述

      红色是根节点(root)。蓝色是子节点也是父节点,绿色的是子节点。其余的线是边。节点和链表中的节点一样都可以存放数据信息。树中的边可以用自引用表示,这种引用就是C/C++里面的指针。通常来说树是顶部小,底部大,且树呈分层结构。root节点时第0层,以此类推。二叉树最多有两个节点。

二叉树搜索

      二叉树一个节点左子节点的关键字小于这个节点,右子节点关键字大于或等于这个父节点。

创建一个树节点

      创建一个树节点包括左节点引用和右节点引用。

//创建一个树的节点
//每个node存放两个数据
//一个左node引用和一个右node引用
class Node
{
    public  int iData;
    public double dData;
    public Node leftNode;
    public Node rightNode;
    //显示树节点信息
    public void showNode()
    {
        System.out.println("{ "+iData+","+dData+" }");
    }
}

创建一个树结构

       创建一个树结构首先是向一个树种插入数据节点。当一棵树为null时,数据项是从树的root节点处开始插入,之后的插入顺序是根据搜索节点顺序规则进行插入。具体规则是:如果数据项比父节点的数据项要小,则插在父节点的左节点(leftNode),如果比父节点的数据项要大,则将新的node插入在父节点的右节点处(rightNode)。

private Node root;
    //插入Node
    //插入之前需要判断是否为null
    //为null需要比较大小直到currentNode为null就插入
    public void insert(int iData,double dData )
    {
        //创建node节点
        Node newNode=new Node();
        newNode.iData=iData;
        newNode.dData=dData;
        //判断root node是否为null
        if(root==null)
        {
            root=newNode;
        }
        //不为null
        else
        {
            Node current=root;
            Node parent;
            while(true)
            {
                parent=current;//保存当current变为null之前的那一个父节点
                if(iData<current.iData)//插入左节点
                {
                    current=current.leftNode;//不断向左node寻找是否为null
                    if(current==null)
                    {
                        parent.leftNode=newNode;
                        return;
                    }

                }
                //插入右节点
                else
                {
                    current=current.rightNode;
                    if(current==null)
                    {
                        parent.rightNode=newNode;
                        return;
                    }
                }

            }

        }
    }

以下图表示以上插入数据节点过程:

这里写图片描述

      在插入节点的过程中其实也就是对tree遍历的过程,最终根据条件遍历到左右节点为null时进行添加新的节点。

查找关键字

      查找关键字是数据结构一项重要操作项,在有序数组中通过二分排序效率非常高。在二叉树中的查找效率也比较高。因为二叉树的添加node的过程就是根据数据项的大小进行有序添加的,并不是毫无秩序的插入数据项。在有序的基础上进行查找关键字效率就会快很多。

//在tree中寻找关键字
    //返回一个Node
    //显示这个Node
    public Node find(int key)
    {
        Node current=root;
        while(current.iData!=key)
        {
            if(current.iData>key)
            {
                current=current.leftNode;
            }else
            {
                current=current.rightNode;
            }
            if(current==null)
                return null;
        }
        return current;
    }

树的最值查找

      树的最值查找在树中查找是比较容易的,因为从root开始查找,最小值只会出现所有父节点的左节点处,同样最大值只会出现在所有父节点的沿着右节点搜索的最底层右节点处。

//查找树中的最大值和最小值 
    //最小值存在于一棵树的最下层的最左node
    //最大值存在于一棵树的最下层的最右node
    public Node[] mVal()
    {
        Node minNode=null;
        Node maxNode=null;
        Node[] maxminVal=new Node[2];
        Node current=root;//从树的顶部开始搜索
        while(current!=null)
        {
            minNode=current;
            current=current.leftNode;   
        }
        maxminVal[0]=minNode;
        current=root;
        while(current!=null)
        {
            maxNode=current;
            current=current.rightNode;
        }
        maxminVal[1]=maxNode;
        return maxminVal;
    }

      以上是通过node数组存放两个最值,这样避免写两个方法,最后返回一个node数组。

对以上树的操作进行测试及结果:

Tree tree=new Tree();
        tree.insert(3, 3.666);
        tree.insert(1, 1.111);
        tree.insert(2, 2.362);
        tree.insert(4, 4.672);
        tree.insert(5, 5.865);
        tree.insert(6, 6.681);
        Node node=tree.find(6);
        if(node==null)
        {
            System.out.println("we can not find it");
        }else
        {
            node.showNode();
        }
        //查找tree中的最值
        Node[] temp=tree.mVal();
        temp[0].showNode();
        temp[1].showNode();
{ 6,6.681 }
{ 1,1.111 }
{ 6,6.681 }

      由于第一个插入节点就是在root节点处进行插入,不管其数据项大小,该节点都是root节点,处于树的最顶层。

二叉树基础知识总结 题外话昨晚面了腾讯,问了一个完全二叉树的题,竟然让我算了快10分钟,因为等比公式记错了导致最后用最原始的方法推算结果也没算对,一下子就懵了。本来精心准备了1周的面试,最后因为自己基础知识记忆不牢固导致了悲剧。不管怎样,还是要继续查漏补缺,准备将数据结构再细细看一遍,先来补上二叉树的这个漏洞吧。 一、树的定义树是一种数据结构,它是由n(n&gt;=1)个有限结点组成一个具有层次关系的集合。 树具有的... 阅读详情

相关推荐

查找二叉树、完全二叉树、线索二叉树、最优二叉树

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、查找二叉树(二叉排序树)二、完全二叉树 前言 2021年上半年 软件设计师 上午试卷中有这样一道题 58.当二叉树的结点数目确定时,________的高度一定是最小的。 A.二叉排序树 B.完全二叉树 C.线索二叉树 D.最优二叉树 我已此为契机,了解一下查找二叉树、完全二叉树、线索二叉树、最优二叉树的一些相关定义(此题结尾会给出答案详解) 一、查找二叉树(二叉排序树) 二叉排序树的定义: 1、若根结点的左子树.

weixin_51201930的博客 4497

【Java】二叉树

二叉树(Binary Tree)是一种常见的树形结构,它由节点(Node)和节点之间的关系构成。每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树中的每个节点可以为空(null)。

qq_61635026的博客 3609

【数据结构】基础二叉树、真二叉树、满二叉树、完全二叉树、二叉树的遍历

树的介绍 简单的看一下树形结构: 生活中的树形结构: 树(Tree)的基本概念 节点:上面的树形结构,是由若干个节点和节点之间,连接起来构成的结构,ABCDEFGH都是一个单独的节点。最上面的节点成为根节点。 根节点:根节点是树层次结构中的最高节点。换句话说,根节点是没有任何父节点的节点。 父节点和子节点:上面的B节点就是E和F节点的父节点,E和F节点就是B节点的子节点。 兄弟节点:拥有相同父节点的节点称为兄弟节点,例如 E和F节点拥有相同的父节点B,所以两者称为兄弟节点。反之 E和G节点没有相同的

一个写湿的程序猿 3711

二叉树(Java实现)

声明:本文部分文章取自于 Java中关于二叉树详解_来学习的小张的博客-CSDN博客_java 二叉树原理 更多关于二叉树详情可以点击上面链接 一:树形结构 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊的节点,称为根节点,根节点没有前驱节点; 除根节点外,其余节点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个

JiaXingNashishua的博客 1万+

Java数据结构之二叉树

1) n个结点的二叉链表中含有n+1【公式2n-(n-1)=n+1】个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种3)一个结点的前一个结点,称为前驱结点4)一个结点的后一个结点,称为后继结点。

qq_64580912的博客 3033

什么是二叉树

1.什么是二叉树?   面试中总有公司会问到二叉树问题,你会不一定能通过面试,但是不会肯定不行,那二叉树到底是什么?   二叉树作为一种重要的树形结构类型,在实际应用中有着十分广泛的应用和重要的意义。因为从许多实际问题中抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能够简单地转换为二叉树形式,而且二叉树的存储结构及其算法都比较简单,因此我们将讨论关于二叉树的存储、运算及应用。 2.二叉树的...

inhacker的博客 5216

二叉树(完美二叉树、完全二叉树、完满二叉树)

二叉树(完美二叉树、完全二叉树、完满二叉树)树的概念树的基本术语二叉树(Binary Tree)什么是二叉树(Binary Tree)二叉树的性质完美二叉树(Perfect Binary Tree)完全二叉树(Complete Binary Tree)完满二叉树(Full Binary Tree)比较区分完美二叉树 v.s. 完全二叉树完满(Full)二叉树 v.s. 完全(Complete)二叉...

老人家独爱茉莉的博客 3万+

二叉树及二叉树的应用

之前没有深入研究过二叉树 因此在这里做一个比较系统梳理规整 大家大可作拿来主义 敬礼,此致~

DerHaseBruder的博客 1461

二叉树、平衡二叉树、完全二叉树、满二叉树

基本概念结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层。二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度。 二叉树在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在

Terry的IT世界 9万+

完美二叉树、完全二叉树、完满二叉树

1、二叉树(Binary Tree) 1.1 什么是二叉树(Binary Tree) 每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。 1.2 二叉树的性质 若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i&amp;amp;amp;gt;=0)。 高度为k的二叉树最多有2^(k+1) - 1个结点(k&amp;amp;amp;gt;=-1)。 (空树的高...

pg的博客 2万+

多台树莓派(主机)通信

在做无人机实验时,有个任务需要 两台无人机 或 无人机与小车 进行通信。 由于我们飞机上用了树莓派,相当于一台电脑,索性选用Socket网络编程。 条件:树莓派、局域网(手机热点或路由器)。需要通信的两台树莓派接入同一个局域网。 如若现场没有网络,可将树莓派配置为无线路由器,发射wifi。网上很多教程,注意一点是树莓派需要先用网线接入路由器再配置。 发送数据: # -*- coding...

LNL_LNL的博客 7233

二叉树、完全二叉树、完满二叉树、满二叉树

简单定义:每个节点最多只有2个子节点的树叫做二叉树。专业定义:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。下图为一棵普通二叉树。

流华追梦的专栏 2841

ECU-TEST笔记&使用技巧01

说明 1)所述均基于如下环境:ECU-TEST 8.0、Win10系统、NI Veristand 2018(HIL测试)。不排除因为版本及软件环境问题,所述方法不奏效或有更好的方法,欢迎交流,一起提高。 2)本博客以问答形式进行,所述问题均来自于实际测试(包括MIL、HIL测试)遇到的问题及需求,目的是提高测试效率和自动化测试序列的可维护性。 3)本博客尽量从测试方法及ECU-TEST原...

Eigrl的博客 1万+

二叉树及特殊的二叉树

本文从二叉树的基本定义出发,介绍了二叉树的特点、以及一些特殊形式的二叉树(包括满二叉树、完全二叉树),总结了二叉树的形式,重点对二叉树的几种遍历形式:前序遍历、中序遍历、后序遍历、层级遍历步骤进行了详细的推导过程的描述。

UncleMing5371的博客 2633

二叉树与线索二叉树

根据函数递归,首先函数进入B结点对B线索化使B的左指针域指向pre后并且pre为B了,然后返回A判断pre的右指针域为空,然后pre(此时已为B)的右指针域指向后继A,然后pre为A,函数接着返回C……在进行遍历二叉表后,我们能够知道遍历操作时结点的前驱和后继,但是以后每次我们想知道结点的前驱和后续都要再遍历一次,在此思路上可以在空指针域里存放某种遍历操作时结点的前驱和后继的线索。线索化的过程即为遍历过程中结点操作为修改该结点空指针的过程,附设一个指针pre表示刚刚访问的结点,即当前结点p的前驱。

24考研人晴落的博客 1914

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5232

【二叉树】构建销毁二叉树

创建数据结构/销毁数据结构/判断是否是完全二叉树

m0_74841364的博客 1370

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 4784

二叉树(真二叉树,满二叉树,完全二叉树)

树: 节点 节点的度(degree):子树的个数 树的度:所有节点度中的最大值 叶子节点(leaf):度为0的节点 层数(level:)根节点在第1层 节点的深度(depth):从根节点到当前节点的唯一路径上的节点总数 节点的高度(height):从当前节点到最远叶子节点的路径上的节点总数 数的深度:所有节点深度中的最大值 数的高度:所有节点高度中的最大值 树的深度等于树的高度 二叉树(Bina...

More reading and learning to become excellent 1558

二叉树,完全二叉树,满二叉树,平衡二叉树的区别

度:指的是一个节点拥有子节点的个数。如二叉树的节点的最大度为2。 深度:数的层数,根节点为第一层,依次类推。 叶子节点:度为0的节点,即没有子节点的节点。 树:树中的每一个节点,可以有n(后续节点)个子节点,但是每个节点只有一个前驱节点。 二叉树:除了叶子节点外,每个节点只有两个分支,左子树和右子树,每个节点的最大度数为2. 满二叉树:除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树...

Nerdant 3239

FPGA中参数化SPI接口设计与Verilog实现

SPI(串行外设接口)作为嵌入式系统的核心通信协议,通过全双工、高速率特性在FPGA与Flash、ADC等外设交互中占据重要地位。参数化设计通过抽象时钟极性、数据位宽等可配置维度,采用分层架构实现硬件复用,显著提升开发效率。Verilog实现需重点处理跨时钟域同步和可配置帧结构,结合AXI总线集成与UVM验证方法学,可构建适应工业控制、物联网网关等场景的高可靠SPI解决方案。

ciya3282的博客 846
上一篇: 基数排序
下一篇: 二叉树遍历与删除
Richard-Cai
博客等级 码龄10年 253粉丝 68原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值