今天是2024.4.26日,早起的一天,加油吧,啥也不说,开干:
一,树的概念:
(结点==节点)
(1)结点:包括一个数据元素以及若干指向其他结点的分支信息;
(2)树:N(N>=0)个结点的有限集合;N=0时,称为空树;
(3)根节点:在树结构中,只有一个结点没有前驱(前件),该节点简称 根节点,简称 根;
(3)父节点:除根结点外,每个节点都有一个 前驱,称为该节点的 父节点;
(6)叶子节点:没有后继的结点;
(4)子节点:除叶子节点外,每个节点都有后继,称为该节点的子节点;
(7)度:树中一个结点的子节点个数称为该节点的度;
(8)树的度:树中结点的最大度数;
(8)树的深度(高度):树的层次;
(9)子树:以某个节点的一个子节点为根节点构成的树,称为该节点的子树;
二,树的性质:
(1)总分支数:N1*1 + N2*2 + N3 *3+ N4*4 + N5*5 + ... + Nn*n(Nn表示度为 n 的节点);
(2)总结点数=N0+N1+N2+N3+...+NNn;
(2)总结点数 = 总分支数 + 1 ;
(3)度为 m 的树第 i 层最多有 m的(i-1)次幂个结点;
举例
一棵树的度为4,其中度为1 2 3 4的节点个数分别为2 2 3 3,求该树的叶子节点个数:
总分支树:2*1+2*2+3*3+4*3=27;
总结点数:27+1=28=N0+2+2+3+3,N0=18;
所以叶子节点个数为 18;
三,二叉树的概念:
任何树都可以转换为二叉树,因此二叉树是学习的重点;
(1)二叉树:每个节点的度不大于 2 并且结点次序不能颠倒;
(2)满二叉树:高度为h,含有( 2 的 h 次幂-1)个结点的二叉树。即除叶子节点外,每个节点的度都为2。
(3)完全二叉树:深度为K,有n个结点的二叉树当且仅当其每一个节点都与深度为k的满二叉树一一对应,称其为完全二叉树;(深度相同)
说白了,完全二叉树是满二叉树的子集,且存在相等的情况;
值得注意的是,完全二叉树是从右缺的;
举例:
深度为5的完全二叉树的结点数不可能为( )
A,15 B,16 C,17 D,18
四,二叉树的性质
(以下讨论情况均为非空二叉树)
(1)N0 = N2 + 1 ; 即叶子节点数 等于 度为2的结点数 加一;
(2)第 K 层最多有 2 的(k减1)次幂 个结点;
(3)高度为H的二叉树最多有 2的h次幂减1个结点;
(4)结点位N的完全二叉树的高度的计算:
举例:一棵二叉树共有25个节点,其中五个是叶子节点,则度为1的结点数为:
因为 N0 = N2 + 1,N2=4,而 N = N0 + N1 + N2;
所以,N1=16;
五,二叉树的存储
(1)顺序存储
自上而下,自左向右,预留空间(空元素);
比如,H,K之间缺少结点, 但必须为他们预留空间;
(2)链式存储
在二叉链表(二叉树的链式存储结构)中链结点至少包含三个域:
六,二叉树的遍历
二叉树的遍历是指按照某条搜索路径访问树中的每个结点,使每个节点被且仅被访问一次。常见的三种遍历方法是 前序/中序/后序遍历。
(1)前序(先序)遍历:先根后左再右;
以上图为例:A是整个树的根节点,B是左节点,左节点遍历完后再遍历右节点——A B;
以B为根结点的子树,先根后左再右,——B D H ,左节点遍历完后再遍历右节点——E;
以A为根结点的左节点遍历完后再遍历右节点;
以C为根节点的子树,先根后左再右——C F G;
因此,遍历顺序为 A B D H E C F G;
(2)中序遍历:先左再根后右
仿照上面思路,遍历顺序为 H D B E A F C G;
(3)后序遍历:先左再右后根
仿照上面思路,遍历顺序为 H D E B F G C A ;
举例:
假设一个二叉树的后序遍历是 G H D E B I J F C A ,中序遍历是 G D H B E A C I F J ,则前序遍历是:
根据中后序遍历容易得出 A 为根节点,中序遍历中 A 之前的都是树的左分支:G D H B E ,A之后的都是树的右分支:C I F J;
根据这个思想,由后序遍历容易得出,A的子节点有 B,C;剩下的就容易得出了。
其前序遍历为:A B D G H E C F I J ;