vlambda博客
学习文章列表

树与二叉树递归版c++


树与二叉树









总算把你给盼来了

现在才关注我 确实是晚了点

但没关系 来了就好


树与二叉树递归版c++


工具:vs code 、ppt

操作系统:Linux

树与二叉树递归版c++

树与二叉树递归版c++




树与二叉树递归版c++
SUMMER


树与二叉树递归版c++

目录

树与二叉树递归版c++

         

树与二叉树递归版c++


一.树与森林


树与二叉树递归版c++

图1A


1.树的基本概念


1.1、定义


  树是n个结点的有限集合。当n=0时,称为空树。而任意非空树应满足:


a.有且仅有一个特定的根结点。如“A”是该树的根结点。

b.当n>1时,其余结点可分为m(m>0)个互不相交的有限集合。其中每一个集合本身又是一棵树,称为根结点的子树。如“c”是一棵子树。


*注:n个结点的树有n-1条边。


2.树的其他概念


2.1结点:指包含数据元素及若干个指向其子树的分支。


2.2度:结点拥有子树数称为结点的度。


如结点“A”的度是3,结点“C”的度是0。

  a.度为0的结点为叶子结点(或终端结点)。“D”、“E”、“F”、“G”、“H”……是叶子结点。

  b.度不为0的结点为非终端结点(或分支结点)。如“A”、“B”、“D”非终端结点。

  c.树的度是树内某个结点的最大值。如上图树的最大值结点有“A”、“C”,度都是为3。所有该树的度是3。


2.3双亲结点:如结点“B”和“C”的双亲结点是“A”。


2.4左子树与右子树:双亲结点下的左子树与右子树。


2.5兄弟与堂兄弟结点:同一个双亲结点的孩子称为兄弟。在同一层而不在双亲结点下的结点称为堂兄弟。


2.6层:树的层次从根结点开始为第一层。如上图的树层数是5。


2.7深度或高度:树中结点的最大层次称为树的深度或高度。



2.二叉树

树与二叉树递归版c++

图2B



2.1定义:

二叉树(binary tree)T是有限个元素的集合(可以为空)。当二叉树非空时,其中有一个元素称为根,余下的元素(如果有的话)被划分成两棵二叉树,分别称为t的左子树和右子树。

2.2特点:

a.二叉树的每个元素都恰好有两棵子树(其中一个或两个可能为空)。
b.二叉树中的每个元素的子树都是有序的,也就是说,有左子树和右子树之分。

2.3二叉树的五种形态:

二叉树一共有五种基本形态。


(1)空二叉树。

(2)只有一个根结点。

(3)根结点只有左子树。

(4)根结点只有右子树。

(5)根结点既有有左子树又有右子树。

树与二叉树递归版c++


2.4特殊二叉树

a.斜树:
所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树

树与二叉树递归版c++


b.满二叉树:
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

树与二叉树递归版c++



c.完全二叉树:
  若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。如下图中。


树与二叉树递归版c++


*注:满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树。


2.5二叉树的性质


性质1 一棵二叉树的第i层上至多有 2i-1(i>=1) 个结点。

性质2 一棵二叉树的高度为 k(k≥1) ,它最少有 k 个元素,最多有 2k-1 个结点。

性质3 一棵二叉树如果其终端结点数为 n0 ,度为2的结点数为 n2 。则 n0=n2+1


性质4 一棵二叉树有 n 个元素,n>0,它的高度最大为 n ,最小高度为 [log2n]+1


性质5设完全二叉树的元素其编号为i 1≤i≤n,有以下关系成立:


(1)若i=1,则该元素为二叉树的根。若i>1,则其父节点的编号为[i/2]。

(2)若2i>n,则该元素无左孩子。否则,其左孩子的编号为2i。

(3)若2i+1>n,则该元素无右孩子。否则,其右孩子的编号为2i+1。

树与二叉树递归版c++





树与二叉树递归版c++

树与二叉树递归版c++


树与二叉树递归版c++


3.二叉树的遍历




二叉树的存储结构——链式存储

以c++的形式实现二叉树的存储结构——链式存储(二叉链表)。

树与二叉树递归版c++


结构:

树与二叉树递归版c++


先序遍历构建二叉树:

树与二叉树递归版c++


3.1、二叉树的四种遍历(递归):

    遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示                                                                            ——《百度百科》


树与二叉树递归版c++
前序遍历:

首先访问根,再先序遍历左子树,最后遍历右子树。

树与二叉树递归版c++


树与二叉树递归版c++


中序遍历:

首先遍历左子树,再访问,最后遍历右子树。

树与二叉树递归版c++


树与二叉树递归版c++


  后序遍历:

首先遍历左子树,再遍历右子树,最后访问

树与二叉树递归版c++


树与二叉树递归版c++


层序遍历

树与二叉树递归版c++


树与二叉树递归版c++


3.3、main()调用

树与二叉树递归版c++


 以上的代码是以递归的形式来写。后面会以“力扣【https://leetcode-cn.com/】”为模型,实现迭代版二叉树。



树与二叉树递归版c++


《》



树与二叉树递归版c++


树与二叉树递归版c++


部分图片来源网络

侵删致歉




转载需经同意并引用出处