一
二叉树定义:
满足以下三个条件
1,根节点
2,去跟,分成两个不相交的集合TL和TR
3,TL和TR也为二叉树(递归定义)
二
基本形态:
由三个节点构成的二叉树的个数
三
性质:
1,第i层有2^(i-1)个节点
2,深度为k的二叉树,做多为 2^(k)-1个节点
k层二叉树有2^(k)-1个节点,叫蛮二叉树
3,度为0的节点的个数为n0
度为1的节点的个数为n1
度为2的节点的个数为n2
则n0=n2+1
推导过程:
设节点总数为n,分支数为b
则:
n=n0+n1+n2
b=n1+2n2
b=n-1
4,假如一棵包含 n 个结点的二叉树中每个结点都可以和满二叉树中编号为1至 n 的结点一、一对应,则称这类二叉树为完全二叉树。
n个节点的完全二叉树,深度为[log2 n]+1
5,完全二叉树中,编号为i的节点,左孩子编号为2i,有孩子为2i+1,双亲编号为floor(i/2)
四
存储结构
1,顺序 先补成完全二叉树
const MAXSIZE = 100; // 暂定二叉树中结点数的最大值为100
typedef struct {
ElemType *data; // 存储空间基址(初始化时分配空间)
int nodeNum; // 二叉树中结点数
} SqBiTree; // 二叉树的顺序存储结构
2,链式
二叉链表:
左孩子域和右孩子域
typedef struct BiTNode {
ElemType data;
struct BiTNode *Lchild, *Rchild; // 左、右孩子指针
} *BiTree;
三叉链表:
typedef struct TriTNode {
ElemType data;
struct BiTNode *Lchild, *Rchild; // 左、右孩子指针
struct BiTNode *parent; // 双亲指针
} *TriTree;
双亲链表
const MAXSIZE = 100; // 暂定二叉树中结点数的最大值为100
typedef struct BPTNode { // 结点结构
ElemType data;
int *parent; // 指向双亲的指针
char LRTag; // 左、右孩子标志域
} BPTNode
typedef struct BPTree{ // 树结构
BPTNode *nodes; // 初始化时分配存储空间
int nodeNum; // 结点数目
int root; // 根结点的位置
} BPTree
cin>>BT.nodeNum; // 输入结点数目
BT.root=0;
cin>> BT.nodes[0].data; // 输入根
BT.nodes[0].parent = -1; // 根的双亲为空
BT.nodes[0].LRTag = 'L';
for (i=1; i<BT.nodeNum; i++)
{
cin>> BT.nodes[i].data >> F >>BT.nodes[i].LRtag;
k=i-1;
while (k>=0 && BT.nodes[k].data != F) k--; // 查询双亲
if (k<0) return FALSE; // 没有找到双亲
BT.nodes[i].parent = k;
return TRUE;
}
}