数据结构之树(Tree)

树(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;
}

= = 。 没写完

猜你喜欢

转载自blog.csdn.net/qq_31729917/article/details/81433277