二叉树的三叉存储

二叉树的三叉存储

大家好,又见面了,我是全栈君。

形态:

二叉树的三叉存储

实现:

/***************************************8
二叉树的三叉链表存储
by Rowandjj
2014/5/23
*****************************************/

#include<iostream>
using namespace std;

typedef int ElemType;    
//-------二叉树的三叉链表存储结构-----------
typedef struct _TREENODE_
{
    struct _TREENODE_ *pParent;//父节点
    struct _TREENODE_ *pLeft;//左孩子
    struct _TREENODE_ *pRight;//右孩子
    
    ElemType data;
}TreeNode,*pTreeNode,**ppTreeNode;
//---------辅助队列-------------------
typedef struct _QUEUENODE_//队列节点
{
    struct _QUEUENODE_ *pNext;
    pTreeNode data;
}QueueNode,*pQueueNode;

typedef struct _QUEUE_//队列存储结构
{
    pQueueNode pHead;
    pQueueNode pTail;

    int nodeCount;
}Queue,*pQueue;

//队列操作定义
void InitQueue(pQueue pQueueTemp);
void EnQueue(pQueue pQueueTemp,pTreeNode pTreeNodeTemp);
void DeQueue(pQueue pQueueTemp,ppTreeNode ppTreeNodeTemp);
void DestroyQueue(pQueue pQueueTemp);
bool IsQueueEmpty(Queue QueueTemp);
//三叉链表树操作定义
void CreateNode(ppTreeNode ppTreeNodeTemp);
void CreateTree(ppTreeNode ppTreeNodeTemp);

void PreTravel(pTreeNode pTreeNodeTemp);
void PostTravel(pTreeNode pTreeNodeTemp);
void LevelTravel(pTreeNode pTreeNodeTemp);
void MidTravel(pTreeNode pTreeNodeTemp);
int GetDepth(pTreeNode pTreeNodeTemp);
void FindNode(pTreeNode pTreeNodeTemp,ElemType e,ppTreeNode ppTreeNodeTemp);
pTreeNode Point(pTreeNode pTreeNodeTemp,ElemType e);
ElemType GetParent(pTreeNode pTreeNodeTemp,ElemType e);
ElemType GetLeftChild(pTreeNode pTreeNodeTemp,ElemType e);
ElemType GetRightChild(pTreeNode pTreeNodeTemp,ElemType e);
ElemType GetLeftSibling(pTreeNode pTreeNodeTemp,ElemType e);
ElemType GetRightSibling(pTreeNode pTreeNodeTemp,ElemType e);
//------------------------------------------

//------队列部分-----------
void InitQueue(pQueue pQueueTemp)
{
    pQueueTemp->pHead = pQueueTemp->pTail = (pQueueNode)malloc(sizeof(QueueNode));
    if(pQueueTemp->pHead == NULL)
    {
        return;
    }
    pQueueTemp->pHead->pNext = NULL;
    pQueueTemp->nodeCount = 0;
}
void EnQueue(pQueue pQueueTemp,pTreeNode pTreeNodeTemp)
{
    if(pQueueTemp == NULL)
    {
        return;
    }
    pQueueNode pQueueNodeTemp = (pQueueNode)malloc(sizeof(QueueNode));
    if(pQueueNodeTemp == NULL)
    {
        return;
    }
    pQueueNodeTemp->data = pTreeNodeTemp;
    pQueueNodeTemp->pNext = NULL;
    pQueueTemp->pTail->pNext = pQueueNodeTemp;
    pQueueTemp->pTail = pQueueNodeTemp;
    pQueueTemp->nodeCount++;
}
void DeQueue(pQueue pQueueTemp,ppTreeNode ppTreeNodeTemp)
{
    if(pQueueTemp == NULL)
    {
        return;
    }
    pQueueNode pDel = pQueueTemp->pHead->pNext;
    pQueueTemp->pHead->pNext = pDel->pNext;
    if(pQueueTemp->pTail == pDel)
    {
        pQueueTemp->pTail = pQueueTemp->pHead;
    }
    *ppTreeNodeTemp = pDel->data;
    free(pDel);
    pQueueTemp->nodeCount--;
}
void DestroyQueue(pQueue pQueueTemp)
{
    if(pQueueTemp == NULL)
    {
        return;
    }
    pQueueNode pTravel = pQueueTemp->pHead->pNext;
    while(pTravel != NULL)
    {
        pQueueTemp->pHead->pNext = pTravel->pNext;
        free(pTravel);
        pTravel = pQueueTemp->pHead->pNext;
    }
    free(pQueueTemp->pHead);
    pQueueTemp->nodeCount = 0;
}
bool IsQueueEmpty(Queue QueueTemp)
{
    return QueueTemp.nodeCount == 0;
}
//------二叉树部分------
void CreateNode(ppTreeNode ppTreeNodeTemp)
{
    int a;
    cin>>a;
    if(a == -1)
    {
        return;
    }
    else
    {
        *ppTreeNodeTemp = (pTreeNode)malloc(sizeof(TreeNode));
        if(*ppTreeNodeTemp == NULL)
        {
            return;
        }
        (*ppTreeNodeTemp)->pLeft = NULL;
        (*ppTreeNodeTemp)->pRight = NULL;
        (*ppTreeNodeTemp)->pParent = NULL;
        (*ppTreeNodeTemp)->data = a;
    
        CreateNode(&(*ppTreeNodeTemp)->pLeft);
        CreateNode(&(*ppTreeNodeTemp)->pRight);
    }
}

void CreateTree(ppTreeNode ppTreeNodeTemp)
{
    if(*ppTreeNodeTemp == NULL)
    {
        return;
    }
    Queue queue;
    CreateNode(ppTreeNodeTemp);
    InitQueue(&queue);
    EnQueue(&queue,*ppTreeNodeTemp);
    (*ppTreeNodeTemp)->pParent = NULL;
    pTreeNode pTreeNodeNew;
    while(!IsQueueEmpty(queue))
    {
        DeQueue(&queue,&pTreeNodeNew);
        if(pTreeNodeNew->pLeft != NULL)
        {
            pTreeNodeNew->pLeft->pParent = pTreeNodeNew;
            EnQueue(&queue,pTreeNodeNew->pLeft);
        }
        if(pTreeNodeNew->pRight != NULL)
        {
            pTreeNodeNew->pRight->pParent = pTreeNodeNew;
            EnQueue(&queue,pTreeNodeNew->pRight);
        }
    }

    DestroyQueue(&queue);
}

void PreTravel(pTreeNode pTreeNodeTemp)
{
    if(pTreeNodeTemp == NULL)
    {
        return;
    }
    cout<<pTreeNodeTemp->data<<" ";
    PreTravel(pTreeNodeTemp->pLeft);
    PreTravel(pTreeNodeTemp->pRight);
}
void PostTravel(pTreeNode pTreeNodeTemp)
{
    if(pTreeNodeTemp == NULL)
    {
        return;
    }
    
    PostTravel(pTreeNodeTemp->pLeft);
    PostTravel(pTreeNodeTemp->pRight);
    cout<<pTreeNodeTemp->data<<" ";
}
void LevelTravel(pTreeNode pTreeNodeTemp)
{
    Queue queue;
    InitQueue(&queue);
    EnQueue(&queue,pTreeNodeTemp);
    
    pTreeNode pTreeNodeNew;
    
    while(!IsQueueEmpty(queue))
    {
        DeQueue(&queue,&pTreeNodeNew);
        if(pTreeNodeNew != NULL)
        {
            cout<<pTreeNodeNew->data<<" ";
        //    if(pTreeNodeNew->pParent != NULL)//打印父节点
        //    {
        //        cout<<"father:"<<pTreeNodeNew->pParent->data<<" ";
        //    }
            if(pTreeNodeNew->pLeft)
            {
                EnQueue(&queue,pTreeNodeNew->pLeft);
            }
            if(pTreeNodeNew->pRight)
            {
                EnQueue(&queue,pTreeNodeNew->pRight);
            }    
        }
    }
    DestroyQueue(&queue);
}
void MidTravel(pTreeNode pTreeNodeTemp)
{
    if(pTreeNodeTemp == NULL)
    {
        return;
    }
    MidTravel(pTreeNodeTemp->pLeft);
    cout<<pTreeNodeTemp->data<<" ";
    MidTravel(pTreeNodeTemp->pRight);
}

int GetDepth(pTreeNode pTreeNodeTemp)
{
    if(pTreeNodeTemp == NULL)
    {
        return 0;
    }
    int i = 0;
    int j = 0;
    if(pTreeNodeTemp->pLeft)
    {
        i = GetDepth(pTreeNodeTemp->pLeft);
    }else
    {
        i = 0;
    }
    if(pTreeNodeTemp->pRight)
    {
        j = GetDepth(pTreeNodeTemp->pRight);
    }else
    {
        j = 0;
    }
    return (i > j) ? i+1 : j+1;
}

void FindNode(pTreeNode pTreeNodeTemp,ElemType e,ppTreeNode ppTreeNodeTemp)
{
    if(pTreeNodeTemp == NULL)
    {
        return;
    }
    if(pTreeNodeTemp->data == e)
    {
        *ppTreeNodeTemp = pTreeNodeTemp;
    }
    else
    {
        if(pTreeNodeTemp->pLeft)
        {
            FindNode(pTreeNodeTemp->pLeft,e,ppTreeNodeTemp);
        }
        if(pTreeNodeTemp->pRight)
        {
            FindNode(pTreeNodeTemp->pRight,e,ppTreeNodeTemp);
        }
    }
}

pTreeNode Point(pTreeNode pTreeNodeTemp,ElemType e)
{
    Queue queue;
    InitQueue(&queue);
    EnQueue(&queue,pTreeNodeTemp);
    pTreeNode pTreeNodeRet;
    while(!IsQueueEmpty(queue))
    {
        DeQueue(&queue,&pTreeNodeRet);
        if(pTreeNodeRet->data == e)
        {
            return pTreeNodeRet;
        }
        else
        {
            if(pTreeNodeRet->pLeft)
            {
                EnQueue(&queue,pTreeNodeRet->pLeft);
            }
            if(pTreeNodeRet->pRight)
            {
                EnQueue(&queue,pTreeNodeRet->pRight);
            }
        }
    }
    DestroyQueue(&queue);
    return NULL;
}

ElemType GetParent(pTreeNode pTreeNodeTemp,ElemType e)
{
    if(pTreeNodeTemp == NULL)
    {
        return -1;
    }
    pTreeNode p = Point(pTreeNodeTemp,e);
    if(p && p != pTreeNodeTemp)//p存在且非根节点
    {
        return p->pParent->data;
    }
    else
    {
        return -1;
    }
}

ElemType GetLeftChild(pTreeNode pTreeNodeTemp,ElemType e)
{
    if(pTreeNodeTemp == NULL)
    {
        return -1;
    }
    pTreeNode p = Point(pTreeNodeTemp,e);
    if(p && p->pLeft)
    {
        return p->pLeft->data;
    }
    else
    {
        return -1;
    }
}
ElemType GetRightChild(pTreeNode pTreeNodeTemp,ElemType e)
{
    if(pTreeNodeTemp == NULL)
    {
        return -1;
    }
    pTreeNode p = Point(pTreeNodeTemp,e);
    if(p && p->pRight)
    {
        return p->pRight->data;
    }
    else
    {
        return -1;
    }
}
ElemType GetLeftSibling(pTreeNode pTreeNodeTemp,ElemType e)
{
    if(pTreeNodeTemp == NULL)
    {
        return -1;
    }
    pTreeNode p = Point(pTreeNodeTemp,e);
    if(p && p!=pTreeNodeTemp && p->pParent && p->pParent->pLeft && p->pParent->pLeft!= p)
    {
        return p->pParent->pLeft->data;
    }
    return -1;
}

ElemType GetRightSibling(pTreeNode pTreeNodeTemp,ElemType e)
{
    if(pTreeNodeTemp == NULL)
    {
        return -1;
    }
    pTreeNode p = Point(pTreeNodeTemp,e);
    if(p && p!= pTreeNodeTemp && p->pParent && p->pParent->pRight && p->pParent->pRight!=p)
    {
        return p->pParent->pRight->data;
    }
    return -1;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116270.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JMS activeMQ

    JMS activeMQ

    2022年3月3日
  • hibernate 二级缓存「建议收藏」

    hibernate 二级缓存「建议收藏」Hibernate缓存缓存(Cache):计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存Hibernate中提供了两个级别的缓存

    2022年5月24日
  • rel=nofollow 是什么意思

    rel=nofollow 是什么意思

    2021年10月31日
  • python股票数据分析_用Python抓取新浪的股票数据「建议收藏」

    最近做数据分析,先是找到了Tushare这个免费开源的第三方财经包,但后来用了几天之后发现,它的日交易历史数据有时候有不准确的情况,查看源代码发现,这个包的数据源是凤凰财经,而对比凤凰网站其站点的数据本身就是有出入的,所以到也不是Tushare的问题。于是百度了一圈,发现很多网友都是获取新浪的股票数据,包括其历史数据和实时数据。于是乎试了一下,发现速度还挺快,没有具体去测时间但从感官上要比Tush…

    2022年4月7日
  • 一致性哈希算法原理详解

    一致性哈希算法原理详解(1)一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环,称为Hash环;(2)接着将各个服务器使用Hash函数进行哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置;(3)最后使用算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针寻找,第一台遇到的服务器就是其应该定位到的服务器

    2022年7月27日
  • 日常IT技巧总结_it工作写经验总结

    日常IT技巧总结_it工作写经验总结一、Windows问题处理技巧Win7插入手机usb弹出窗口关闭1.按“WIN+R”弹出运行,在运行界面输入【services.msc】,点击确定,进入服务;2.在服务列表找到“ShellHardwareDetection”服务,双击打开;3.在弹出的设置对话框,将服务的“启动类型”设置为“自动”,并单击“启动”,按“确定”保存设置。4.再次打开“运行”,输入“gpedit…

    2022年9月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号