2. 二叉树的性质
-
性质1:非空二叉树上的叶子结点数等于双分支结点数加1。
-
性质2:非空二叉树的第i层上最多有2的i-1次个结点(i≥1)。
-
性质3:高度为h的二叉树最多有2的h次减1个结点(h≥1)
-
性质4:完全二叉树中层序编号为i的结点(1≤i≤n,n≥1,n为结点数)有以下性质:
- 若 i≤Ln/2 」,即 2i≤n,则编号为i的结点为分支结点,否则为叶子结点。
- 若n为奇数,则每个分支结点都既有左孩子结点,又有右孩子结点;若n为偶数,则编号最大的分支结点(编号为Ln/2」只有左孩子结点,没有右孩子结点,其余分支结点都有左、右孩子结点。
- 若编号为i的结点有左孩子结点,则左孩子结点的编号为2i;若编号为i的结点有右孩子结点,则右孩子结点的编号为2i+1。
- 除根结点以外,若一个结点的编号为i,则它的双亲结点的编号为Li/2 」
- 性质5:具有n个(n>0)结点的完全二叉树的高度为「log2(n+1)]或Llog2n]+1。
- 说明:对于一棵完全二叉树,结点总数n可以确定其形态,n只能是0或1。当n为偶数时,n=1;当n为奇数时,n=0。
3. 二叉树的存储结构
- 顺序存储结构(SqBinTree)
存完全二叉树
- 链式存储结构
用data 表示值域,用于存储对应的数据元素,lchild 和 rchild分别表示左指针域和右指针域,分别用于存储左孩子结点和右孩子结点的存储地址。这种链式存储结构通常简称为二叉链(binary linked list)。二叉链中通过根结点指针 b来唯一标识整个存储结构,称为二叉树b。
typedef struct BTNode
{
int data;
struct BTNode* lChild;
struct BTNode* rChild;
}BTNode;
A1->lChild=A2;
A1->rChild = A3;
A2->lChild = A4;
A2->rChild = NULL;
A3->lChild=A5;
A3->rChild = NULL;
- 二叉链表存储结构(树的孩子兄弟存储结构)
typedef struct BTNode
{
int data;
struct BTNode* child;
struct BTNode* sibling;
}BTNode;
链接:
A1->child= A2;
A1->sibling = NULL;
A2->sibling = A3;
A3->sibling =A4;
A4->sibling = NULL;
取A1孩子结点A3:
A1->child->sibling