树和二叉树

一、树

  1. 常见的数据结构

(1)集合
集合的定义是由一组无序且唯一(即不能重复)的项组成的。不包含任何元素的集合就叫做空集。

%% 集合:无序、互异的元素 pie showData title 集合(Set) "A" : 1 "B" : 1 "C" : 1 "D" : 1

(2)线性结构
线性结构是一个有序数据元素的集合。常用的线性结构有:线性表,栈,队列,双队列,数组,串,……

%% 线性结构:单向链表 flowchart LR A[1] --> B[2] --> C[3] --> D[4] --> E[NULL]

(3)树形结构
n个有限节点组成一个具有层次关系的集合。

%% 树形结构:二叉树 graph TD A((A)) --> B((B)) A --> C((C)) B --> D((D)) B --> E((E)) C --> F((F))

(4)图形结构
图形结构——多个对多个。

%% 图形结构:无向图(带环) graph LR A --- B A --- C A --- D B --- C C --- D
  1. 树的定义

树是一种数据结构,它是由n(n >= 0)个有限节点组成一个具有层次关系的集合。树是一类非线性结构。这种结构结点之间有分支,并具有层次关系。它非常类似于自然界中的树。
树的作用:表达家谱顺序、行政组织结构、计算机文件结构、书的教材章节结构等。

%% 家谱树(从上到下世代顺序) graph TD %% 第一代(曾祖辈) ZF[曾祖父] %% 第二代(祖辈) ZF --> YF[祖父] %% 第三代(父辈) YF --> F[父亲] YF --> GUM[姑姑] %% 第四代(子辈) F --> C1[长子] F --> D[女儿] %% 样式优化 classDef male fill:#99ccff,stroke:#0066cc classDef female fill:#ffccff,stroke:#cc0066 class ZF,YF,F,GUF,C1,C2,TB male class ZM,YM,M,GUM,D female
  1. 树的基本概念

(1)树是n(n ≥ 0)个结点的有限集。
(2)当n = 0时称为空树。
(3)当n > 0时为非空树,在任意一棵非空树中,有且仅有一个称为根的结点,其余的结点可分为m(m ≥ 0)个互不相交的有限集T1,T2,……,Tm,其中每一个集合又称为一棵树,并且称为根的子树;同理,每一棵子树又可以分为若干个互不相交的有限集……

总结树的特性:
(1)空树是树的特例;
(2)非空树中至少有一个结点,称为树的根,只有根结点的树称为最小树;
(3)在含有多个结点的树中,除根结点外,其余结点构成若干棵子树,且各子树间互不相交。

  1. 树的基本术语
术语 定义
树的结点 包含一个数据元素及若干个指向其子树的分支
结点的度 一个结点拥有的子树数目
树的度 一棵树上所有结点度的最大值
叶子结点(终端结点) 度为零的结点
分支结点(非终端结点) 度大于零的结点
路径(从根到结点的) 由从根到该结点所经分支和结点构成
孩子结点 结点的子树的根称为该结点的孩子结点
双亲结点 相应地,该结点称为孩子的双亲结点
兄弟 具有同一父结点的子结点互称兄弟
堂兄弟 其双亲在同一层的结点互为堂兄弟
祖先结点 从根到该结点所经分支上的所有结点
子孙结点 以某结点为根的子树中任一结点都称为该结点的子孙
结点的层次 从根结点到该结点所经过的路径长度加1
树的深度 树中叶子结点具有的最大层次数
树的宽度 整棵树中某一层中最多的结点数称为树的宽度
有序树 如果将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,与之相对的是无序树
第一个孩子 在有序树中,最左边的子树的根称为第一个孩子
最后一个孩子 在有序树中,最右边的子树的根称为最后一个孩子

二、二叉树

  1. 二叉树的定义

二叉树是n(n ≥ 0)个结点的有限集合,这个集合或是空集,或是由一个根结点以及两棵互不相交的、被称为根的左子树和右子树所组成;左子树和右子树分别又是一棵二叉树。
二叉树的特点:每个结点至多只有两棵子树,且二叉树的子树有左右之分,其次序不能任意颠倒。

graph TD A((A)) --> B((B)) A --> C((C)) B --> D((D)) B --> E((E)) C --> F((F)) D --> G((G)) E --> H((H)) E --> I((I))

二叉树和树的不同:
(1)树中结点的最大度数没有限制,而二叉树结点的最大度数为2。
(2)树的结点无左、右之分,而二叉树的结点有左右之分。

  1. 满二叉树和完全二叉树

满二叉树:一棵深度为k且有2^k-1个结点的二叉树。(特点:每一层上的结点数都是最大结点数)

graph TD A((1)) --> B((2)) A --> C((3)) B --> D((4)) B --> E((5)) C --> F((6)) C --> G((7))

完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。(特点:至多只有最下面两层的结点的度可以小于2,且倒二层如果只有一个孩子,那必是左孩子。)

graph TD A((1)) --> B((2)) A --> C((3)) B --> D((4)) B --> E((5)) C --> F((6))
  1. 二叉树的性质

(1)在二叉树的第i层上至多有2ⁱ⁻¹个结点(i ≥ 1)
(2)深度为k的二叉树至多有2^k-1个结点(k ≥ 1)
(3)对任何一棵二叉树,如果其叶结点数n₀,度为2的结点数为n₂,则一定满足:n₀=n₂+1
(4)具有n个结点的完全二叉树的深度为floor(log₂n)+1
(5)对于一棵n个结点的完全二叉树,对任一个结点(编号为m):
如果m = 1,则结点m为根,无父结点;如果m > 1,则其父结点编号为floor(i / 2)
如果2m > n,则结点m无子节点,即结点m为叶结点;否则左孩子编号为2m
如果2m + 1> n,则结点m无右孩子,否则右孩子编号为2m + 1

  1. 二叉树的遍历

一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
(1)访问根结点(D);
(2)遍历该结点的左子树(L);
(3)遍历该结点的右子树(R);

遍历方案:
DLR:先序遍历(Preorder Traverse,亦称前序遍历)
———访问根结点、遍历左树、遍历右树。
LDR:中历(Inorder Traverse)
———遍历左树、访问根结点、遍历右树。
LRD:后历(Postorder Traverse)
———遍历左树、遍历右树、访问根结点。

graph TD A((A)) --> B((B)) A --> C((C)) B --> D((D)) B --> E((E)) C --> F((F)) D --> G((G)) E --> H((H)) E --> I((I))

先序遍历的结果为:ABGDEHICF
中序遍历的结果为:GDBHEIAFC
后序遍历的结果为:GDHIEBFCA

结论:若二叉树中各结点的值均不相同,则:由二叉树的前序序列和中序序列,或由其 其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。

posted @ 2025-05-16 14:51  Jason227  阅读(17)  评论(0)    收藏  举报