C Language 树 - Tree和BinaryTree
Posted Adorable_Rocy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C Language 树 - Tree和BinaryTree相关的知识,希望对你有一定的参考价值。
前言:数据结构中的树和二叉树是占着特别大的比重的,树和二叉树不是小编之前介绍的线性结构了,树形结构属于非线性结构,常用的树形就是树和二叉树,线性结构可以表示元素或者多个元素一对一的情况,但是树形结构中,一个节点可以与多个结点相对应,因此是可以表示层次结构的数据
- 如下图是一个简单的三次树
概念篇~
补充~ 树的表示形式有如下四种:
- 树形表示法
- 文氏图表示法
- 凹入表示法
- 括号表示法
A(B(D,E,F),C(G,H))
-
树是 N (N >= 0 )个结点的有限集合,N = 0 时,称为空树,这是一种特殊情况。在任意一棵非空树中
应满足:1) 有且仅有一个特定的称为根的结点。 2)当 N > 1 时,其余结点可分为 m ( m > 0)个互不相交的有限集合T1 , T2 , T3 , .... Tm ,其中每一个 集合本身又是一棵树,并且称为根结点的子树。
-
树的定义是一种递归的数据结构。树作为一种逻辑结构,同时也是表示一种分层结构,树的特点如下:
1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点。 2)树中所有结点可以有零个或多个后继结点。
3.树的专业术语:
-
结点的度与树的度。树中某个结点的子树的个数称为结点的度。树中所有结点的度的最大值称为树的度。通常将度为m的树称为m次树。如上图所示,最大度为3,所以是一颗三次树。
-
分支结点 与叶子节点。树中度不为零的节点称为非终端结点,我们称之为分支结点。度为零的结点称之为叶子结点。度为1的结点称为单分支结点。度为2的结点称为双分支结点。
3. 路径与路径长度。可以简单的理解为从A到任意一个结点的路径长度等于通过的结点数减一。如上图A到I的路径为(A,B,D,I),其长度为3。
4.孩子节点、双亲结点和兄弟结点。如图所示,BC互为兄弟结点,在同一个路径下,每个后继节点称为该结点的孩子结点。例如D是B的孩子结点。相反的是,B是D的双亲结点,于是在同一路径下,可以把每个结点经过的每个结点(不包括自身节点),称为该结点的子孙结点。可以从A结点到N结点之前的所有经过的结点(不包括N结点本身),称为该结点的祖先节点。
5.结点层次和树的高度。结点层次或者结点深度都是从树根开始定义的,树根结点为第一层,他的孩子结点为第二层,以此类推,一个结点所在的层次为其双亲结点的层次加一。树中结点的最大层次称为树的高度或者树的深度。
6.有序树和无序树。树中各结点的子树是按照一定的次序从左向右安排的,且相对次序是不能全部随意变换的,则称为有序树,否则称为无序树,一般情况下。默认指向有序树。
7.森林(forest):n(n>0)个互不相交的树的集合称为森林。反之,给m(m>1)棵树添加一个共同的双亲元素,则合并了树森林,森林就转换成了树。
二、树的存储结构
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
(1)、双亲表示法(parent storage stuceture)
结构定义为:
typedef struct{
ElemType data; //元素类型
int parent; //parent定位
};
补充:十分便捷的定位到双亲的位置,能够快速的找到双亲
(2)、孩子表示法(child chain storage structure)
typedef struct node{
ElemType data;
struct node *son[MaxSons];
};
(3)、孩子兄弟表示法(child borther chain storage structure)
typedef struct tnode{
ElemType data;
struct tnode *vp; //指向孩子
struct tnode *hp; //指向兄弟
};
其实孩子兄弟表示法是不是和二叉树结构很相似呢?进行旋转45度就可以得到二叉树。
以上是关于C Language 树 - Tree和BinaryTree的主要内容,如果未能解决你的问题,请参考以下文章
leetcode算法:Trim a Binar Search Tree
Lowest Common Ancestor of a Binary Tree(二叉树公共祖先)
leetcode -day23 Construct Binary Tree from Inorder and Postorder Traversal & Construct Binar