数据结构笔记 - 树

2019-08-22  本文已影响0人  MrOreo
🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲🌲

背景

这篇文章主要记录🌲的相关知识。最近又重新读了一遍数据结构的课本及相关读物,因此想记录一些基本的知识点。

1. 树的表示法:

typedef int DataType;
typedef struct SNode
{
    DataType data;
    struct SNode *lchild, *rchild;
} SNode, * BiTree;

2. 二叉树的存储

3. 二叉树的遍历

遍历:二叉树的遍历按照某个次序,对于每个结点进行访问,且只访问一次。
因此共有四种:

// 前序遍历
void preOrderTraverse(BiTree t) 
{
    if (t == null) return;
    invite(t->data);
    preOrderTraverse(t->lchild);
    preOrderTraverse(t->rchild);
}
// 中序遍历
void inOrderTraverse(BiTree t) 
{
   if (t == null) return;
   inOrderTraverse(t->lchild);
   invite(t->data);
   inOrderTraverse(t->rchild);
}
// 后序遍历
void postOrderTraverse(BiTree t)
{
    if (t == null) return;
    postOrderTraverse(t->lchild);
    postOrderTraverse(t->rchild);
    invite(t->data);
}

对于二叉树的创建,如果按照前序遍历的方式,只不过将访问的操作替换成了,构建结点并赋值的操作。
其他仍旧和前序遍历的代码是一致的。
note:需要对原始的二叉树进行扩展,使其叶子结点变为非叶子结点。可以通过添加#元素的结点来判断是否为为null的操作。

4. 线索二叉树

由于二叉链表存储含有空节点,因此为了更好地利用空间及查找每个结点的前驱和后继,
因此出现了线索二叉树。其实就是一个双向链表的形式。

5. Huffman哈弗曼树(最优二叉树)

6. 二叉排序树(二叉查找树)BST

7. 平衡二叉树AVL

不平衡时进行旋转操作:

在插入结点b时:

数据结构
typedef int DataType;
typedef struct SNode
{
    DataType data;
    int bf;
    struct SNode *lchild, *rchild;
} SNode, * BiTree;
// 右旋
void r_rotate(BiTree *p)
{
    BiTree L = (*p)->lchild;
    (*p)->lchild = L->rchild; 
    L->rchild = (*p);
    (*p) = L;
}

拿到右旋结点p的左子树L,将L的rchild挂到p的lchild。将p挂到L的rchild。

// 左旋
void l_rotate(BiTree *p)
{
    BiTree R = (*p)->rchild;
    (*p)->rchild = R->lchild;
    R->lchild = (*p);
    (*p) = R;
}

拿到左旋结点p的右子树R,将R的lchild挂到p的rchild。将p挂到R的lchild。

8. 多路查找树(B树),前提:排序树。

上述的二叉树的每个结点都只能存储一个元素,且最多有两个子结点。
而多路的定义是:每个节点孩子数可以多于两个,每个结点可以存储多个元素。
有4中特殊形式:

2-3树:每个结点都具有两个孩子(2结点)或三个孩子(3结点)。

B树:针对内存与外存之间的存取而专门设计的。

参考资料

数据结构(C语言版)
大话数据结构

上一篇 下一篇

猜你喜欢

热点阅读