二叉树的三叉存储

二叉树的三叉存储

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

形态:

二叉树的三叉存储

实现:

/***************************************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; }

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java中compareTo()方法比较字符串详解

    Java中compareTo()方法比较字符串详解中心:String是字符串,它的比较用compareTo方法,它从第一位开始比较,如果遇到不同的字符,则马上返回这两个字符的ascii值差值.返回值是int类型1.当两个比较的字符串是英文且长度不等时,1)长度短的与长度长的字符一样,则返回的结果是两个长度相减的值a=”hello”;b=”hell”;num=1;或者a=”h”;b=”hello”;num=4;2)…

  • 5分钟装好Rational Rose激活成功教程版 非常好用[通俗易懂]

    5分钟装好Rational Rose激活成功教程版 非常好用[通俗易懂]1:下载两个文件点此下载,第一个是安装包,第二个是打开这个安装包内镜像的工具。2.打开下载第二个压缩包的工具,名字是rmxngq_1272,里面有一个应用程序名字为:virtualdrivemaster,双击这个应用程序,会弹出一个界面,把下载的第一个压缩包第一个bin文件(IBM.rational….

  • x201换风扇_笔记本怎么换风扇 ThinkPad X201i换风扇图文教程

    x201换风扇_笔记本怎么换风扇 ThinkPad X201i换风扇图文教程ThinkPadX201i换电扇图文教程:拆机之前,我们需求先对X201i的散热电扇在停止了开端的理解,得知价钱从10元左右的单电扇,到上百的散热全体都有,而且还分东芝产和松下产等不同产地的,小编选择了松下产的整套散热(包括散热片和电扇),价钱为150,电扇固定办法为小螺丝。假定拿到电脑修理店去换的话,小编猜测我们所需求的费用至少在200-300元之间。一:拆机前的准备螺丝刀,小毛刷和安排螺丝的…

  • pageruler蛋白marker_蛋白marker上样量

    pageruler蛋白marker_蛋白marker上样量下载软件(其实就是一堆脚本)gitclonehttps://github.com/jhcepas/eggnog-mapper.git下载数据库aliaspython=/usr/bin/python2.7pythondownload_eggnog_data.py拆分蛋白文件xx.faaawk’!/^>/{printf”%s”,$0;n=”\…

    2022年10月25日
  • vim的复制粘贴命令_vim编辑器常用命令

    vim的复制粘贴命令_vim编辑器常用命令接触linux操作系统之后使用vi/vim编辑器用的就比较多,其实vi/vim编辑文件特别方便,但是一些常见的指令模式下的命令确很容易忘,特别是复制剪切粘贴经常忘,所以小结下以后查用起来比较方便。1.复制剪切粘贴撤销复制:复制一行则:yy复制三行则:3yy,即从当前光标+下两行。复制当前光标所在的位置到行尾:y$复制当前光标所在的位置到行首:y^剪切:剪切一行:dd前切三

  • c++中的排序函数Sort的具体用法(vb中sort函数怎么用)

    最近在刷ACM经常用到排序,以前老是写冒泡,可把冒泡带到OJ里后发现经常超时,所以本想用快排,可是很多学长推荐用sort函数,因为自己写的快排写不好真的没有sort快,所以毅然决然选择sort函数用法1、sort函数可以三个参数也可以两个参数,必须的头文件#include和usingnamespacestd;2、它使用的排序方法是类似于快排的方法,时间复

发表回复

您的电子邮箱地址不会被公开。

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