当前位置 博文首页 > XSES_yasuoman的博客:数据结构——树与二叉树
见王道书P119
结点数 = 总度数(分支数) + 1,这个 1 是根结点。
度为 m 的树 | m 叉树 |
---|---|
任意结点的度 <= m | 任意结点的度 <= m |
至少有一个结点度 = m | 允许所有结点的度都 < m |
一定是非空树,至少有 m + 1 个结点 | 可以是空树 |
度 为 ? m ? 的 树 、 ? m ? 叉 树 , 第 ? i ? 层 至 多 有 ? m i ? 1 ? 个 结 点 \begin{array}{l} 度为\ m\ 的树、\ m\ 叉树,第\ i\ 层至多有\ {m^{i - 1}}\ 个结点 \end{array} 度为?m?的树、?m?叉树,第?i?层至多有?mi?1?个结点?
高 度 为 ? h ? 的 ? m ? 叉 树 、 m 度 树 至 多 有 ? ( m h ? 1 ) ( m ? 1 ) ? 个 结 点 ( 等 比 数 列 求 和 ) \begin{array}{l} 高度为\ h \ 的\ m \ 叉树、m 度树至多有\ \frac{{({m^h} - 1)}}{{(m - 1)}}\ 个结点(等比数列求和) \end{array} 高度为?h?的?m?叉树、m度树至多有?(m?1)(mh?1)??个结点(等比数列求和)?
高 度 为 ? h ? 的 度 为 ? m ? 的 树 至 少 有 ? h + m ? 1 个 结 点 ( 等 比 数 列 求 和 ) \begin{array}{l} 高度为\ h \ 的度为\ m\ 的树至少有\ h + m - 1 个结点(等比数列求和) \end{array} 高度为?h?的度为?m?的树至少有?h+m?1个结点(等比数列求和)?
KaTeX parse error: Undefined control sequence: \ at position 43: …点的\ m\ 叉树的最小高度为\? ?\left\lceil {{{…
注意以上都是向下取整
KaTeX parse error: Unknown column alignment: * at position 789: …{\begin{array}{*?{20}{c}} {{n_0}…
满二叉树和完全二叉树可以采用顺序存储:
同“串”一样,我们从下标 1 开始存储,方便对应。
#define MaxSize 255
ElemType data[MaxSize];
基本操作
顺序存储——非完全二叉树
对于非完全二叉树,则不能使用上述只用一个数组搞定的方式,而是要借助结构体来完成定义:
struct TreeNode{
ElemType value;
bool isEmpty;
};
TreeNode data[MaxSize];
很浪费空间!
// ElemType 可以是一个结构体哈!长见识了吧!
struct ElemType{
int value;
}
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
Struct BiTNode *parent; // 考研中经常考没有这个指针的情形,有这个叫做“三叉链表”
}BiTNode, *BiTree;
初始化
struct ElemType{
int value;
}
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
// 初始化:
BiTree root = NULL;
// 赋值:
root = (BiTNode *)malloc(sizeof(BiTNode));
root -> data.value = 1;
root -> lchild = NULL;
root -> rchild = NULL;
时间复杂度为 O(n),空间复杂度为 O(h + 1) 1 指的是最后一层的空结点
void PreOrder(BiTree T){
if (T != NULL) {
visit(T);
PreOrder(T -> lchild);
PreOrder(T -> rchild);
}
}
void InOrder(BiTree T){
if (T != NULL) {
PreOrder(T -> lchild);
visit(T);
PreOrder(T -> rchild);
}
}
void PostOrder(BiTree T){
if (T != NULL) {
PreOrder(T -> lchild);
PreOrder(T -> rchild);
visit(T);
}
}
int treeDepth(BiTree T) {
if (T == NULL)
return 0;
else {
int l = treeDepth(T -> lchild);
int r = treeDepth(T -> rchild);
// 树的深度 = Max(左子树深度,右子树深度) + 1
return l > r ? l + 1 : r + 1;
}
}