2. 树和二叉树(一)

(定义部分摘自清华大学出版社《数据结构(C语言版)》)

1. 树的定义和基本术语

   树(Tree)是具有n(n>=0)个节点的有限集合。在任意一颗非空树中:(1)有且仅有一个特定的节点称为“根”(root);(2) 当n>1时,其余节点又可以分为m个互不相交的有限集合T1,T2,...,Tm。这些集合,称为子树。m为与root直接相连的节点数目。

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

   结点拥有的子树数目称为结点的度(degree)

   出度为0的节点称为叶子(Leaf)或者终端结点

   度不为零的结点称之为分支节点。 

   一棵树的度是树内各结点的度的最大值。

   一棵树的深度(depth):自root出发,到达某个叶子的路径长度的最大值。

   有序树: 树中结点的各个子树从左至右是有序的,否则为无序树。

   森林(Forest): m个互不相交的树的集合。对树中的每个节点而言,其子树的集合即为森林。

   ---------------------------------------------------------------------------------------------------

   二叉树(Binary Tree)

   一种特殊的树结构,其特点是每个结点至多有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,即为有序树。

   满二叉树: 一棵深度为k且有 2^k-1个节点的二叉树。

   完全二叉树: 对满二叉树的结点进行连续编号,约定编号从根节点开始,自上而下,自左至右。深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。

2. 二叉树的性质

   性质1 在二叉树的第i层上至多有2^(i-1)个节点(i>=1)。

   性质2 深度为k的二叉树至多有2^k -1个结点(k>=1)。

   性质3 对于任意一棵二叉树T,如果其终端结点数为n0,度为2的结点树为n2,则有 n0 = n2 +1;

   性质4 具有n个结点 的完全二叉树的深度为floor(logn)+1(此处floor意为取下整)。

   性质5 如果对一棵有n个节点的完全二叉树的结点按层序编号,则对任一节点i(1<=i<=n),有

           (1) 如果i=1,则节点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点 floor(i/2)。

           (2) 如果2i >n, 则结点i无左孩子;否则其左孩子为节点2i。

           (3) 如果2i +1 >n, 则结点i无右孩子;否则其右孩子为结点2i+1.

根据二叉树的特点,既可以用数组的形式来存储,也可以用链式存储的结构。(ps: 如果是完全二叉树,数组形式存储比较好。然而最坏情况下,当一个深度为k且只有k个单节点的树用数组存储的时候,数组的大小为 2^k -1。)所以一般推荐用链式结构存储二叉树。

typedef struct BinaryNode

{

        TElemType  data;  // 数据域

        struct BinaryNode *Lchild, *Rchild; //指针域,左右孩子节点指针

        //   [optional] struct BinaryNode *Parent;  如果需要找到parent节点 

}BinaryNode, *BinaryTree;

BinaryNode 用于定义二叉树中的结点;

BinaryTree 用于存储二叉树结构。

(未完待续)

原文地址:https://www.cnblogs.com/double-win/p/3592051.html