树
遍历
树的节点的机构
typedef struct TreeNode
{
char data;
struct TreeNode* lchild;
struct TreeNode* rchild;
}TreeNode;
前序遍历
根节点 -> 左节点 -> 右节点
/*
#名称# preOrder
#功能# 对二叉树进行前序遍历读值
#参数# T:树的头指针
#返回值# 无
*/
void preOrder(TreeNode* T)
{
if(T == NULL)
{
return;
}
else
{
printf("%c ",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
中序遍历
左节点 -> 根节点 -> 右节点
/*
#名称# inOrder
#功能# 对二叉树进行中序遍历读值
#参数# T:树的头指针
#返回值# 无
*/
void inOrder(TreeNode* T) {
if(T == NULL)
{
return;
}
else
{
inOrder(T->lchild);
printf("%c ",T->data);
inOrder(T->rchild);
}
}
后序遍历
左节点 -> 右节点 -> 根节点
/*
#名称# postOrder
#功能# 对二叉树进行后序遍历读值
#参数# T:树的头指针
#返回值# 无
*/
void postOrder(TreeNode* T) {
if(T == NULL)
{
return;
}
else
{
postOrder(T->lchild);
postOrder(T->rchild);
printf("%c ",T->data);
}
}
应用场景
树的结构
二叉查找树
二叉查找树是一种特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树等等,它实际上是数据域有序的二叉树,即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根结点的数据域。
二叉搜索树的特点主要是较小的值总是保存在左节点上,相对较大的值总是保存在右节点上。这种特点使得二叉搜索树的查询效率非常高
平衡二叉树
平衡二叉树是由前苏联的两位数学家G.M.Adelse-Velskil和E.M.Landis联合提出,因此一般也称作AVL树,AVL树本质还是一棵二叉查找树,只是在其基础上增加了“平衡”的要求,需保证其左子树与右子树的高度之差的绝对值不超过1,其中左子树与右子树的高度因子之差称为平衡因子。
对于AVL树,不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡。由于旋转比较耗时,所以AVL树适合用于插入与删除次数比较少,但查找多的情况。