二叉树的理论基础

二叉树的分类 

        二叉树分为满二叉树,完全二叉树,二叉搜索树,平衡二叉搜索树。 

    满二叉树(如图)

一颗二叉树只有度为0和度为2的节点,度为0的节点在同一层,这就是一个满二叉树。也可以说成是深度为k,有2的k次方-1个节点。

    完全二叉树(如图)

完全⼆叉树的定义如下:在完全⼆叉树中,除了最底层节点可能没填满外,其余每层节点数
都达到最⼤值,并且最下⾯⼀层的节点都集中在该层最左边的若⼲位置。若最底层为第 h
层,则该层包含 1~ 2^h -1 个节点。

 

拓展:有很多语言中都存在优先级队列其实是⼀个堆(大顶堆和小顶堆),堆就是⼀棵完全⼆叉树,同时保证⽗⼦节点的 顺序关系

   ⼆叉搜索树

前面的满二叉树和完全二叉树都是没有数值的,而二叉搜索树是有数值的。它是一个有序的树故又称二叉排序树。规律如下

        若它的左⼦树不空,则左⼦树上所有结点的值均⼩于它的根结点的值;

        若它的右⼦树不空,则右⼦树上所有结点的值均⼤于它的根结点的值;
        它的左、右⼦树也分别为⼆叉排序树。
以下的两个图都是二叉搜索树:
        

   平衡⼆叉搜索树

        说白了,平衡二叉搜索树 它要么是⼀棵空树要么它的左右两个⼦树的⾼度差的绝对值不超过1,并且左右两个⼦树都是⼀棵平衡⼆叉树。

        如图:

 

         最后⼀棵 不是平衡⼆叉树,因为它的左右两个⼦树的⾼度差的绝对值超过了1。

        拓展:C++mapsetmultimapmultiset的底层实现都是平衡⼆叉搜索树,所以mapset 的增删操作时间时间复杂度是logn,注意我这⾥没有说unordered_mapunordered_set

unordered_map unordered_map 底层实现是哈希表。而哈希表的时间复杂度和空间复杂度均为1.

二叉树的存储方式

二叉树的存储方式分为两种:链式存储和顺序存储。

   链式存储

        二叉树的链式存储和链表的存储方式其实是一致的,只不过二叉树是两个指针,一个左指针,一个右指针,分别用来指向他的左右孩子节点,而链表仅有一个指针,指向他的下一个节点,这两者本质其实是一样的。

        链式存储图如下:

     顺序存储

        顺序存出无非就是用数组来存储二叉树的左右孩子,其内存是连续分布的。这一点和链式存储是有所区别的,链式存储是通过指针把分布在散落 在各个地址的节点串联⼀起。

        顺序存储图如下:

        那么大家不难想到,用数组存储二叉树如何遍历呐?

                如果父节点而数组下标为i的话,那么他的左右孩子的下标分别为 2i + 1, 2i+2。一般我们比较常用的还是链式存储,但是也要知道 可以用数组来存储二叉树。

二叉树的遍历方式

        二叉树主要有两种遍历方式:深度优先遍历、广度优先遍历。这两种遍历方式就类似于图论中的深度优先搜索和广度优先搜索。

  深度优先搜索        

     深度优先搜索说白了,就是顺着二叉树的根节点,先往深⾛,遇到叶⼦节点再往回⾛。一些有基础的同学一听到深度优先搜索可能第一反应就是,前序遍历,中序遍历,后序遍历。可是也仅仅是了解,下面我就来深度讲解一下:

深度优先遍历:

                        前序遍历(中左右)递归法 迭代法

                        中序遍历(左中右)递归法 迭代法

                        后序遍历(左右中)递归法 迭代法

有同学总分不清这三个顺序,经常搞 混,我这⾥教⼤家⼀个技巧。 这⾥前中后,其实指的就是中间节点的遍历顺序,只要⼤家记住 前中后序指的就是中间节点的位置分别在第一个第二个第三个的位置上就可以了。

 

图解:

广度优先遍历

        就是一层一层的去遍历。主要的遍历方法就是迭代法。

深度优先遍历和广度优先遍历小总结:

        深度优先遍历一般我们都是使用递归法来解决的,其实栈这种数据结构底层就是用递归来实现的(先进后出),所以说每次每一次出栈都要等到上面的元素都出去了当前元素才能出去,就像递归必须等到里面的函数执行完并且返回数值的时候,当前的函数才能继续往下执行。

        深度优先搜素一般是使用队列来实现的,利用队列先进先出的特性来实现一层一层的遍历。

 二叉树的定义

        上面我们也说了二叉树主要有两种存储方式:链式存储和顺序存储。顺序存储就是⽤数组来存, 这个定义没啥可说的。下面我们就来看看链式存储的二叉树节点定义的方式:

js定义二叉树:

function TreeNode(){
    this.val = null;
    this.left = null;
    this.right = null;
}

c++定义二叉树:

struct TreeNode{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x):val(x),left (NULL),right(NULL){}
};

节点的定义很重要,力扣上会默认给出节点的定义,而在面试过程中,面试官可能让我们手写出完整的代码逻辑。这时候就需要我们不仅写出主要的代码逻辑,一些基本的数据结构的定义也要能写出来。不过牛客网是不会给出默认定义的,全程需要自主实现。

以上就是主要介绍了二叉树的理论基础,主要介绍了二叉树的种类、存储方式、遍历方式以及定义,比较全面的介绍了二叉树各方面的重点。扫了一遍基础。

加油哦!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现平衡二叉树的各种算法(如AVL树、红黑树等)可以应用在SCAU(South China Agricultural University,华南农业大学)的数据结构与算法课程中。这些算法的目标是确保二叉树的左右子树高度差不超过1,从而使树的高度保持相对较小的水平,提高插入、删除和查找等操作的效率。 一种常见的平衡二叉树算法是AVL树。实现AVL树的关键是通过旋转操作来保持树的平衡。在SCAU,可以使用多种编程语言(如C++、Java等)实现AVL树算法。插入新节点时,首先按照二叉查找树的方式找到合适的插入位置,然后通过不同的旋转操作调整树的平衡。具体的实现包括左旋、右旋、左右旋和右左旋等操作。 另一种常见的平衡二叉树算法是红黑树。SCAU可以使用编程语言(如C++、Java等)实现红黑树算法。红黑树通过使用辅助信息(即节点的颜色)来维持树的平衡。红黑树的插入操作包括节点的颜色变换和旋转操作。具体实现包括左旋、右旋、颜色变换等操作。 无论是AVL树还是红黑树,它们的实现都需要处理平衡调整,在插入或删除节点时通过旋转和颜色变换等操作来保持树的平衡。实现这些算法需要对平衡树的定义和性质有深入的理解,并具备编程技巧和数据结构基础。SCAU的学生在学习数据结构与算法课程时,可以通过理论学习和实践编程来掌握实现平衡二叉树的各种算法。除了课程的学习,还可以通过参考相关的教材、博客、论文等来加深对平衡二叉树算法实现的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值