二叉树的三叉存储

二叉树的三叉存储

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

形态:

二叉树的三叉存储

实现:

/***************************************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)
上一篇 2022年1月23日 下午7:00
下一篇 2022年1月23日 下午7:00


相关推荐

  • 函数 Func

    函数 Func1 函数函数是用来完成特定任务的独立代码块 函数的参数 参数可以提供默认值 用来简化函数调用 参数可以当做传入参数也可以当做传出参数 即传入的参数值可以被修改 所有参数放在圆括号内函数的返回值 与 OC 的语法不通 以 func 关键字为前缀 有返回值用 来表示用返回值 并添加返回值类型函数类型 函数类型包括参数值类型和返回值类型 每一个函数类型可以当做是普通的类型来处理 可以做函数的

    2026年3月20日
    3
  • 带case操作的update语句_多个case when嵌套

    带case操作的update语句_多个case when嵌套1、场景:由于多次循环执行数据库操作是非常耗费性能的。因此,我们需要尽可能一条UPDATE语句更新多条数据。2、方式:casewhen拼凑UPDATE表名SET(目标字段)BRANCH_NO=CASEWHEN(筛选条件)BANK_BRANCH_ID=’-10212’THEN ‘TU32958123’WHENBANK_BRANCH_ID=’-10213’THEN ‘TU32958112’ELSE’测试’END,COMMENTS=CASEWH

    2025年9月21日
    12
  • pycharm怎么配置django环境_pycharm环境搭建

    pycharm怎么配置django环境_pycharm环境搭建用Pycharm安装配置Django框架1.打开Pycharm—–左下角—-Terminal命令行 pipinstalldjango#默认下载最新版本django框架 pipinstalldjango==1.11.8#可以下载自己所需的指定版本 pipshowdjangoversion#查看自己当前的django框架版本可能下载的途中会出现如下错…

    2022年8月25日
    11
  • linux awk 数组和循环[通俗易懂]

    linux awk 数组和循环[通俗易懂]awk作为强大的文本处理工具,少不了数组处理。awk中数组叫做关联数组(associativearrays),下标可以是数字也可以是字符串。awk中的数组不必提前声明,也不必声明大小,初始化数组元素用0或空串,这根据上下文而定。一语法语法: awk'{pattern+action}’  或 awk’pattern{action}’其中pattern表示AWK

    2022年7月19日
    29
  • 企业微信宣布支持接入 OpenClaw

    企业微信宣布支持接入 OpenClaw

    2026年3月15日
    1
  • 嵌入式学习路线「建议收藏」

    嵌入式学习路线「建议收藏」嵌入式学习路线1.前言2.嵌入式硬件方向3.嵌入式软件方向4.嵌入式软件学习路线4.1.打好软件基础4.2.学习ARM体系结构编程4.3.嵌入式系统的构建4.4.嵌入式驱动程序的开发4.5.嵌入式应用程序的开发4.6.综合项目5.总结1.前言嵌入式技术是各种电子产品的核心技术,也是工业4.0、远程医疗、3D打印等新兴产业的核心技术,具有广阔的发展前景。很多计算机、电子信息类专业的学生都想把嵌入式开发作为自己的职业目标,但是因为嵌入式涉及的知识太多,太杂,太广,很多嵌入式初学者陷入嵌入式知识的海洋中,东学

    2022年6月11日
    32

发表回复

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

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