树(Tree)
Q:为什么要用树?
对于大量的数据,使用链表的线性访问的时间消耗很大。于是提出了树的概念。树的应用十分广泛,操作系统的文件目录就是典型的树形结构。大部分对树的操作的时间复杂度可以被干到O(LogN)。
树的一般实现或表示方法
这里介绍树的孩子兄弟表示法,另外还有别的表示方法,有兴趣可以自己查一下清华大学的教材。这里的数据域使用int类型方便测试,更一般的抽象数据结构表示用ElementType。只需要定义树的第一个孩子,然后定义第二个孩子时用第一个孩子的兄弟表示,第三个孩子用第二个孩子的兄弟表示,以此类推。
typedef struct TreeNode
{//树的孩子兄弟表示法
int value;
struct TreeNode* FirstChilde;
struct TreeNode* NextSibling;
}*PtrTreeNode;
二叉树
二叉树是树的一种,特点是每个结点的儿子不能多于两个。
二叉查找树(二叉排序树)
二叉查找树是二叉树的一种,特点是
1. 若结点X的左子树不空,则其左子树上所有结点的值都小于等于结点X的值
2. 若结点X的右子树不空,则其右子树上所有结点的值都大于等于结点X的值
3. 结点X的左右子树分别为二叉查找树
二叉树的实现或表示方法
typedef struct TreeNode
{//二叉树的表示
int value;
Tree Left;
Tree Right;
}*Tree;
二叉排序树的实现
二叉排序树的数据结构定义和二叉树的一样,只是在增删改查方式上有不同。
Tree CreateTree()
{
Tree T = (TreeNode*)malloc(sizeof(TreeNode));
if (T != NULL)
{
T->value = 0;
T->Left = NULL;
T->Right = NULL;
}
else
{
cout << "apply for a new tree failed" << endl;
}
return T;
}
void MakeEmpty(Tree T)
{//置空树方法
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
}
TreeNode* Find(int val, Tree T)
{//寻找二叉查找树中(第一个)值为val的结点
if (T==NULL)
{
return NULL;
}
else
{
if (val < T->value)
return Find(val, T->Left);
else if (val > T->value)
{
return Find(val, T->Right);
}
else
{
return T;
}
}
}
TreeNode* FindMinByRecursion(Tree T)
{//递归方法找最小值
if (T == NULL)
{
return NULL;
}
else if(T->Left==NULL)
{
return T;
}
else
{
return FindMinByRecursion(T->Left);;
}
}
TreeNode* FindMaxByNotRecursion(Tree T)
{//非递归方法找最大值(不递归就循环)
if (T != NULL)
{
while (T->Right != NULL)
{
T = T->Right;
}
}
return T;
}
= = 。 没写完