数据结构基础

#include <iostream>
#include <Windows.h>
using namespace std;

typedef struct _NODE_
{
    _NODE_* pRight;
    _NODE_* pLeft;

    int  e;
    int Count;
    void InitMember(int e)
    {
        pRight = pLeft = NULL;

        Count = 1;

        this->e = e;
    }
}Node,*pNode;

typedef struct _QUEUE_//存储兄弟节点
{
    pNode pNodeTemp;
    _QUEUE_* pNext;

    void InitMember()
    {
        pNodeTemp = NULL;
        pNext = NULL;

    }
}Queue,*pQueue;

typedef struct _QUEUELIST_
{
    pQueue pHead;
    pQueue pTail;
    int    nCount;
    void InitMember()
    {
        nCount = 0;
        pHead = pTail = NULL;
    }
}QueueList,*pQueueList;

BOOL InQueue(pQueueList pQueueListTemp,pNode pNodeTemp);  //BinaryTree Node Insert  QueueList
BOOL OutQueue(pQueueList pQueueListTemp,pNode& pNodeTemp);
BOOL IsQueueEmpty(pQueueList pQueueListTemp);
void DestroyQueue(pQueueList pQueueListTemp);

BOOL CreateTree(pNode& pNodeTemp);

BOOL PreTravelTree(pNode pNodeTemp);
BOOL MidTravelTree(pNode pNodeTemp);       //!  SortTree;
BOOL PostTravelTree(pNode pNodeTemp);
BOOL LevelTravelTree(pNode pNodeTemp);     //!   Queue
void DestroyTree(pNode& pNodeTemp);
int  GetDepth(pNode pNodeTemp);
BOOL GetFather(pNode pNodeTemp,int e,pNode& pNodeFather);
BOOL GetLeftSon(pNode pNodeFather);
BOOL GetRightSon();

BOOL GetLeftBrother(pNode pNodeTemp);
BOOL GetRightBrother(pNode pNodeTemp);

BOOL FindNode(pNode pNodeRoot,int e,pNode& pNodeTemp);
BOOL CreateSortTree(pNode& pNodeTemp,int a);

BOOL InsertNode();
BOOL DeleteNode();

//LineTree    ListTree
//Parent
//Brother
//BinaryTree 3叉List   ---》双向二叉树

//Binary Tree    Sort Tree   AVL   索引Tree   线索Tree  伸展Tree  BTree  B+ Tree B- Tree
//字典Tree     键Tree   双键链Tree   红黑树

//SortTree

//通信
//sys   HideProcss

int main()
{

    pNode pNodeTemp = NULL;

    int a[] = {1,20,9,9,67,87,-2,-100,43,-2};

    int i = 0;
    for (i=0;i<sizeof(a)/sizeof(int);i++)
    {
        if (CreateSortTree(pNodeTemp,a[i])==FALSE)    //MidTravel
        {
            return 0;
        }

    }
        PreTravelTree( pNodeTemp);
      //  MidTravelTree( pNodeTemp);       //!  SortTree;
      //  PostTravelTree( pNodeTemp);
      //  LevelTravelTree( pNodeTemp);

    MidTravelTree(pNodeTemp);

    cout<<endl;

    cout<<GetDepth(pNodeTemp)<<endl;

    pNode pNodeFather = NULL;

    if (GetFather(pNodeTemp,87,pNodeFather)==TRUE)
    {
        cout<<pNodeFather->e<<endl;
    }

    DestroyTree(pNodeTemp);

/*    pNode pNodeTemp = NULL;

    if(CreateTree(pNodeTemp)==FALSE)
    {
        return;
    }

    cout<<"Pre:"<<endl;
    PreTravelTree(pNodeTemp);
    cout<<endl;

    cout<<"Mid:"<<endl;
    MidTravelTree(pNodeTemp);
    cout<<endl;

    cout<<"Post:"<<endl;
    PostTravelTree(pNodeTemp);
    cout<<endl;

    cout<<"Level:"<<endl;
    LevelTravelTree(pNodeTemp);
    cout<<endl;

    DestroyTree(pNodeTemp);

}

BOOL CreateTree(pNode& pNodeTemp)
{
    int  a = 0;
    cin>>a;
    if(a==-1)
    {
        return FALSE;
    }

    pNodeTemp = (pNode)malloc(sizeof(Node));

    if(pNodeTemp==NULL)
    {
        return FALSE;
    }
    pNodeTemp->InitMember(a);

    CreateTree(pNodeTemp->pLeft);
    CreateTree(pNodeTemp->pRight);

    return TRUE;*/

}

BOOL CreateSortTree(pNode& pNodeTemp,int a)   //3
{
    if (pNodeTemp!=NULL)
    {

        if (a>pNodeTemp->e)    //  1
        {
            CreateSortTree(pNodeTemp->pLeft,a);
        }

        else if(a<pNodeTemp->e)
        {
            CreateSortTree(pNodeTemp->pRight,a);
        }

        else
        {
            pNodeTemp->Count++;

            return TRUE;
        }
    }
    else
    {
        pNodeTemp = (pNode)malloc(sizeof(Node));

        if (pNodeTemp==NULL)
        {
            return FALSE;
        }

        pNodeTemp->InitMember(a);

        return TRUE;

    }
}
BOOL PreTravelTree(pNode pNodeTemp)   //Travel
{
    if(pNodeTemp!=NULL)
    {
    int i = 0;
        for (i=0;i<pNodeTemp->Count;i++)
        {
                cout<<pNodeTemp->e<<"  ";
        }

        //for  for

        if(pNodeTemp->pLeft!=NULL)
        {
            PreTravelTree(pNodeTemp->pLeft);
        }

        if(pNodeTemp->pRight!=NULL)
        {
            PreTravelTree(pNodeTemp->pRight);
        }

    }

    return TRUE;
}
BOOL MidTravelTree(pNode pNodeTemp)
{
    if(pNodeTemp!=NULL)
    {
        //for  for

        if(pNodeTemp->pLeft!=NULL)
        {
            MidTravelTree(pNodeTemp->pLeft);
        }

        int i = 0;
        for (i=0;i<pNodeTemp->Count;i++)
        {
                cout<<pNodeTemp->e<<"  ";
        }

        if(pNodeTemp->pRight!=NULL)
        {
            MidTravelTree(pNodeTemp->pRight);
        }

    }

    return TRUE;
}
BOOL PostTravelTree(pNode pNodeTemp)
{
    if(pNodeTemp!=NULL)
    {

        //for  for

        if(pNodeTemp->pLeft!=NULL)
        {
            PostTravelTree(pNodeTemp->pLeft);
        }

        if(pNodeTemp->pRight!=NULL)
        {
            PostTravelTree(pNodeTemp->pRight);
        }

int i = 0;
        for (i=0;i<pNodeTemp->Count;i++)
        {
                cout<<pNodeTemp->e<<"  ";
        }

    }

    return TRUE;
}
BOOL LevelTravelTree(pNode pNodeTemp)
{
    QueueList QueueListTemp;
    QueueListTemp.InitMember();

    pNode pNodeNew = NULL;
    if(pNodeTemp!=NULL)
    {
        if(InQueue(&QueueListTemp,pNodeTemp)==FALSE)
        {
            return FALSE;
        }

        while(!IsQueueEmpty(&QueueListTemp))
        {
            if(OutQueue(&QueueListTemp,pNodeNew)==FALSE)
            {
                return FALSE;
            }

            cout<<pNodeNew->e<<endl;

            if(pNodeNew->pLeft!=NULL)
            {
                InQueue(&QueueListTemp,pNodeNew->pLeft);
            }
            if(pNodeNew->pRight!=NULL)
            {
                InQueue(&QueueListTemp,pNodeNew->pRight);
            }
        }
    }

    return TRUE;

}

void DestroyTree(pNode& pNodeTemp)
{
    if(pNodeTemp!=NULL)
    {

        if(pNodeTemp->pLeft!=NULL)
        {
            DestroyTree(pNodeTemp->pLeft);
        }
        if(pNodeTemp->pRight!=NULL)
        {
            DestroyTree(pNodeTemp->pRight);
        }

        free(pNodeTemp);

    }
}

BOOL InQueue(pQueueList pQueueListTemp,pNode pNodeTemp)
{
    pQueue pQueueTemp  = (pQueue)malloc(sizeof(Queue));
    if(pQueueTemp==NULL)
    {
        return FALSE;
    }

    pQueueTemp->InitMember();

    pQueueTemp->pNodeTemp = pNodeTemp;

    if(pQueueListTemp->pHead==NULL)
    {
        pQueueListTemp->pHead = pQueueListTemp->pTail = pQueueTemp;
    }

    else
    {
        pQueueListTemp->pTail->pNext = pQueueTemp;
        pQueueListTemp->pTail = pQueueTemp;
    }

    pQueueListTemp->nCount++;

    return TRUE;

}
BOOL OutQueue(pQueueList pQueueListTemp,pNode& pNodeTemp)
{
    if(IsQueueEmpty(pQueueListTemp))
    {
        return FALSE;
    }

    pNodeTemp = pQueueListTemp->pHead->pNodeTemp;

    pQueue  pQueueTemp = NULL;

    pQueueListTemp->pHead = pQueueListTemp->pHead->pNext;

    free(pQueueTemp);

    pQueueListTemp->nCount--;

    if(pQueueListTemp->nCount==0)
    {
        pQueueListTemp->pTail = NULL;
    }

    return TRUE;

}

//1 i=1;  j = 0

int  GetDepth(pNode pNodeTemp)   //Line List
{

    if (pNodeTemp==NULL)
    {
        return -1;
    }

    int i = 0;
    int j = 0;
    if (pNodeTemp->pLeft!=NULL)
    {
        i = GetDepth(pNodeTemp->pLeft);   //i = -1;
    }
    else
    {

        i = 0;
    }

    if (pNodeTemp->pRight!=NULL)
    {
        j = GetDepth(pNodeTemp->pRight);
    }

    else
    {

        j = 0;
    }

    return i>j?i+1:j+1;
}

void DestroyQueue(pQueueList pQueueListTemp)
{
    pNode pNodeTemp = NULL;
    while (!IsQueueEmpty(pQueueListTemp))
    {
        OutQueue(pQueueListTemp,pNodeTemp);   //NULL = 10;
    }
}

BOOL IsQueueEmpty(pQueueList pQueueListTemp)
{
    if(pQueueListTemp->nCount==0)
    {
        return TRUE;
    }

    return FALSE;
}

BOOL FindNode(pNode pNodeRoot,int e,pNode& pNodeTemp)
{

    QueueList QueueListTemp;

    QueueListTemp.InitMember();

    if (pNodeRoot==NULL)
    {
        return FALSE;
    }

    else
    {
        if (pNodeRoot->e==e)
        {
            pNodeTemp = pNodeRoot;

            return TRUE;
        }

        else
        {
            InQueue(&QueueListTemp,pNodeRoot);
            pNode pNodeNew = NULL;
            while (!IsQueueEmpty(&QueueListTemp))
            {

                OutQueue(&QueueListTemp,pNodeNew);

                if (pNodeNew->pLeft!=NULL)
                {
                    if (pNodeNew->pLeft->e==e)
                    {

                        pNodeTemp = pNodeNew->pLeft;
                        return TRUE;
                    }

                    else
                    {
                        InQueue(&QueueListTemp,pNodeNew->pLeft);
                    }
                }

                if (pNodeNew->pRight!=NULL)
                {
                    if (pNodeNew->pRight->e==e)
                    {

                        pNodeTemp = pNodeNew->pRight;
                        return  TRUE;
                    }

                    else
                    {
                        InQueue(&QueueListTemp,pNodeNew->pRight);
                    }
                }
            }
        }
    }

    return FALSE;
}

BOOL GetFather(pNode pNodeTemp,int e,pNode& pNodeFather)
{

    pNode pNodeSon = NULL;

    QueueList QueueListTemp;

    QueueListTemp.InitMember();

    if (FindNode(pNodeTemp,e,pNodeSon)==FALSE)
    {

        return FALSE;
    }

   if(pNodeSon==pNodeTemp)
   {
        return FALSE;
   }

   InQueue(&QueueListTemp,pNodeTemp);
   pNode pNodeNew = NULL;

   while (!IsQueueEmpty(&QueueListTemp))
   {

        OutQueue(&QueueListTemp,pNodeNew);

        if (pNodeNew->pLeft==pNodeSon)
        {

            pNodeFather = pNodeNew;
            return TRUE;
        }

        else if (pNodeNew->pRight==pNodeSon)
        {
            pNodeFather = pNodeNew;
            return TRUE;
        }
        else
        {
            InQueue(&QueueListTemp,pNodeNew->pLeft);
            InQueue(&QueueListTemp,pNodeNew->pRight);

        }

   }

   DestroyQueue(&QueueListTemp);

   return FALSE;
}
BOOL GetLeftSon(pNode pNodeFather)
{

    return TRUE;
}
BOOL GetRightSon()
{
    return TRUE;
}

BOOL GetLeftBrother(pNode pNodeTemp)
{

    return TRUE;
}
BOOL GetRightBrother(pNode pNodeTemp)
{

    return TRUE;
}
时间: 2024-11-08 21:03:41

数据结构基础的相关文章

数据结构基础总结

数据的逻辑结构 数据的存储结构 单链表是递归结构 迭代是指从当前元素获得集合中的后继元素. 迭代功能由Tterable可迭代接口和Tterator迭代器接口实现. 栈和队列 是两种特殊的线性表,特殊之处在于插入和删除操作的位置受到限制. 栈:插入和删除只允许在线性表的一端进行,后进先出. 队列:插入和删除分别在线性表的两端进行,先进先出. 数组: 1.数组是随机存取结构,这是数组最大的优点. 2.数组一旦占用一片存储空间,这片存储空间的地址和长度就确定的,不能更改,因此数组只能进行赋值.取值两种

中国大学MOOC-陈越、何钦铭-数据结构基础习题集 03-1. 二分法求多项式单根

03-1. 二分法求多项式单根(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 杨起帆(浙江大学城市学院) 二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0. 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2:否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2): 如

翻译:程序员数据结构基础:选择正确的数据结构

本文转载自GameDev.net,仅供学习交流.因为刚刚开始学习翻译,难免有些疏漏,如果有哪些地方翻译的不正确,请不吝告知,万分感谢. 原文链接:http://www.gamedev.net/page/resources/_/technical/general-programming/data-structures-for-pre-college-programmers-choosing-the-right-structure-r2991 网络上的许多初学者还是学生.通常初学者通过在网上看教程,

算法与数据结构基础10:C++实现——拓扑排序

一 定义 拓扑排序是对有向无环图(Directed Acyclic Graph简称DAG)顶点的一种排序, 它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面. 二 先决条件 能够进行拓扑排序图有两个先决条件:有向.无环,即有向无环图. 三 偏序全序 连通图:任意两点之间都存在至少一条边 偏序:非连通图(有向无环图满足偏序关系) 全序:单连通图 四 结果唯一性 对于仅满足偏序关系的有向无环图中,因为有两个点之间的关系是不确定的,所以导致排序的结果是不唯一的. 满足全序关系的有

数据结构基础温故-6.查找(上):基本查找与树表查找

只要你打开电脑,就会涉及到查找技术.如炒股软件中查股票信息.硬盘文件中找照片.在光盘中搜DVD,甚至玩游戏时在内存中查找攻击力.魅力值等数据修改用来作弊等,都要涉及到查找.当然,在互联网上查找信息就更加是家常便饭.查找是计算机应用中最常用的操作之一,也是许多程序中最耗时的一部分,查找方法的优劣对于系统的运行效率影响极大.因此,本篇讨论一些查找方法. 一.顺序查找 1.1 基本思想 顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

算法与数据结构基础11:C++实现——二拆搜索树节点删除

基于我的另一篇文章<算法与数据结构基础4:C++二叉树实现及遍历方法大全> ,二叉树的结构用的这篇文章里的. 二查找叉树的删除可以细分为三种情况: 1 被删除的是叶子节点,直接删除: 2 被删除只有一个子节点,指针下移: 3 有两个子节点,为了不破坏树的结构,需要找出一个节点来替换当前节点. 根据二叉树的特点,当前节点大于所有左子树,小于所有右子树, 可以用左子树中最大的节点,或者右子树最小的节点来替换当前节点,然后删除替换节点. // BSTree.h #include <cstdio

OpenCV基础数据结构--基础入门

 图像数据结构 IPL 图像: IplImage |-- int  nChannels;     // 色彩通道数(1,2,3,4) |-- int  depth;         // 象素色深: |                       //   IPL_DEPTH_8U, IPL_DEPTH_8S, |                       //   IPL_DEPTH_16U,IPL_DEPTH_16S, |                       //   IPL_

Python之微信H5斗牛出租平台搭建数据结构基础

微信H5斗牛出租平台搭建下载网站:h5.fanshubbs.com联系Q1687054422一.数据结构基础 a.什么是数据结构 b.数据结构的分类 c.列表 列表d.栈 二.栈的Python实现 a.栈的应用--括号匹配为题 括号匹配实现b.队列 c.队列的实现 d.队列的实现原理--环形队列 e.队列的实现原理--环形队列 ![](http://i2.51cto.com/images/blog/201802/03/07e08bf827bebcb6e258e9ccfd28f20a.jpg?x-

数据结构基础(1)--数组C语言实现--动态内存分配

数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数组在删除或者插入元素的时候,要移动元素的坐标不好确定.规律: 1.如果要在数组中第pos个位置插入一个元素(应该从后面开始移动) for( i=cnu;i>=pos;i--) pBase[i]=pBase[i-1]; 2.删除数组第pos位置的元素 for(i=pos+1;i<=cnu;i--)