节点形态:

二叉树的二叉链表存储_先序遍历

实现:

/******************************************
二叉树的二叉链表存储
by Rowandjj
2014/5/18
******************************************/
#include<IOSTREAM>
using namespace std;

/*二叉树的二叉链表存储表示*/
typedef int TElemType;
typedef struct _TREENODE_
{
    TElemType data;//值
    struct _TREENODE_ *lChild;//左孩子
    struct _TREENODE_ *rChild;//右孩子
}TreeNode,*pTreeNode,**ppTreeNode;
/*--------------辅助队列-------------------*/
typedef struct _QUEUE_NODE_//队列节点定义
{
    pTreeNode data;//数据域(存储二叉树节点)
    struct _QUEUE_NODE_ *pNext;//指针域
}QueueNode,*pQueueNode;

typedef struct _QUEUE_
{
    pQueueNode pHead;//队列头指针
    pQueueNode pTail;//队列尾指针
    int nodeCount;//队列节点个数
}Queue,*pQueue;
/*队列基本操作*/
void InitQueue(pQueue pQueueTemp);
void EnQueue(pQueue pQueueTemp,pTreeNode pTreeNodeTemp);
bool DeQueue(pQueue pQueueTemp,ppTreeNode ppTreeNodeTemp);
bool IsQueueEmpty(Queue QueueTemp);
void DestroyQueue(pQueue pQueueTemp);
//-----------------------------------------------------------------------
/*二叉树基本操作*/
void InitTree(ppTreeNode ppTreeNodeTemp);
void CreateTree(ppTreeNode ppTreeNodeTemp);
void DestroyTree(ppTreeNode ppTreeNodeTemp);
bool IsEmpty(pTreeNode pTreeNodeTemp);
void PreTravel(pTreeNode pTreeNodeTemp);//先序遍历
void MidTravel(pTreeNode pTreeNodeTemp);//中序遍历
void PosTravel(pTreeNode pTreeNodeTemp);//后序遍历
void LevelTravel(pTreeNode pTreeNodeTemp);//层次遍历
int GetDepth(pTreeNode pTreeNodeTemp);//求二叉树深度
void FindNode(pTreeNode pTreeNodeTemp,int data,ppTreeNode pFind);//查找节点。假设成功则用pFind返回
void Assign(pTreeNode pTreeNodeTemp,TElemType data);//赋值
void GetRoot(pTreeNode pTreeNodeTemp,void (*print)(TElemType));//获取根节点
pTreeNode GetParent(pTreeNode pTreeNodeTemp,TElemType data);//获取父节点
pTreeNode GetPoint(pTreeNode pTreeNodeTemp,TElemType data);//返回指向元素值为data的节点的指针
pTreeNode GetLeftChild(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的左孩子
pTreeNode GetRightChild(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的右孩子
pTreeNode GetLeftSibling(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的左兄弟
pTreeNode GetRightSibling(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的右兄弟
bool InsertChild(pTreeNode pTreeNodeTemp,int flag,pTreeNode pTreeNew);//将pTreeNew总体插到pTreeNodeTemp中,约定pTreeNew右子树为空,依据标志位flag的0或者1来推断插入位置
bool DeleteChild(pTreeNode pTreeNodeTemp,int flag);//flag==0,删除左子树。否则删除右子树

void printNode(TElemType 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)
{
    pQueueNode pNodeNew = (pQueueNode)malloc(sizeof(QueueNode));
    if(pNodeNew != NULL)
    {
        pNodeNew->data = pTreeNodeTemp;
        pNodeNew->pNext = NULL;

        pQueueTemp->pTail->pNext = pNodeNew;
        pQueueTemp->pTail = pNodeNew;
        
        pQueueTemp->nodeCount++;
    }
    
}
bool DeQueue(pQueue pQueueTemp,ppTreeNode ppTreeNodeTemp)
{
    if(IsQueueEmpty(*pQueueTemp))
    {
        return false;
    }
    pQueueNode pDel = pQueueTemp->pHead->pNext;
    pQueueTemp->pHead->pNext = pDel->pNext;
    *ppTreeNodeTemp = pDel->data;    
    pQueueTemp->nodeCount--;
    if(pQueueTemp->pTail == pDel)
    {
        pQueueTemp->pTail = pQueueTemp->pHead;
    }

    free(pDel);
    return true;
}
bool IsQueueEmpty(Queue QueueTemp)
{
    return (QueueTemp.nodeCount > 0) ?

false : true; } void DestroyQueue(pQueue pQueueTemp) { if(pQueueTemp != NULL) { pQueueNode pTemp = pQueueTemp->pHead->pNext; while(pTemp!=NULL) { pQueueTemp->pHead->pNext = pTemp->pNext; free(pTemp); pTemp = pQueueTemp->pHead->pNext; } free(pQueueTemp->pHead); pQueueTemp->pHead = pQueueTemp->pTail = NULL; pQueueTemp->nodeCount = 0; } } //------------------二叉树操作实现-------------------------------- void CreateTree(ppTreeNode ppTreeNodeTemp) { int a = 0; cin>>a; if(a == -1) { return; } else { *ppTreeNodeTemp = (pTreeNode)malloc(sizeof(TreeNode)); if(*ppTreeNodeTemp != NULL) { (*ppTreeNodeTemp)->data = a; (*ppTreeNodeTemp)->lChild = NULL; (*ppTreeNodeTemp)->rChild = NULL; CreateTree(&(*ppTreeNodeTemp)->lChild); CreateTree(&(*ppTreeNodeTemp)->rChild); } } } void DestroyTree(ppTreeNode ppTreeNodeTemp) { if(*ppTreeNodeTemp == NULL) { return; } if((*ppTreeNodeTemp)->lChild != NULL) { DestroyTree(&(*ppTreeNodeTemp)->lChild); } if((*ppTreeNodeTemp)->rChild != NULL) { DestroyTree(&(*ppTreeNodeTemp)->rChild); } free(*ppTreeNodeTemp); *ppTreeNodeTemp = NULL; } bool IsEmpty(pTreeNode pTreeNodeTemp) { return (pTreeNodeTemp == NULL); } void PreTravel(pTreeNode pTreeNodeTemp)//先序遍历 { if(pTreeNodeTemp != NULL) { cout<<pTreeNodeTemp->data<<" ";//先訪问根节点 PreTravel(pTreeNodeTemp->lChild);//再先序遍历左子树 PreTravel(pTreeNodeTemp->rChild);//最后先序遍历右子树 } } void InitTree(ppTreeNode ppTreeNodeTemp) { *ppTreeNodeTemp = NULL; } void MidTravel(pTreeNode pTreeNodeTemp)//中序遍历 { if(pTreeNodeTemp != NULL) { MidTravel(pTreeNodeTemp->lChild);//先左子树 cout<<pTreeNodeTemp->data<<" ";//再根节点 MidTravel(pTreeNodeTemp->rChild);//最后右子树 } } void PosTravel(pTreeNode pTreeNodeTemp)//后序遍历 { if(pTreeNodeTemp != NULL) { PosTravel(pTreeNodeTemp->lChild);//先左子树 PosTravel(pTreeNodeTemp->rChild);//再右子树 cout<<pTreeNodeTemp->data<<" ";//最后根节点 } } int GetDepth(pTreeNode pTreeNodeTemp) { int i = 0; int j = 0; if(pTreeNodeTemp == NULL) { return 0; } else { if(pTreeNodeTemp->lChild != NULL) { i = GetDepth(pTreeNodeTemp->lChild); }else { i = 0; } if(pTreeNodeTemp->rChild != NULL) { j = GetDepth(pTreeNodeTemp->rChild); }else { j = 0; } return (i>j)?i+1:j+1; } } void FindNode(pTreeNode pTreeNodeTemp,int data,ppTreeNode pFind) { if(pTreeNodeTemp == NULL) { return; } if(pTreeNodeTemp->data == data) { *pFind = pTreeNodeTemp; } else { FindNode(pTreeNodeTemp->lChild,data,pFind); FindNode(pTreeNodeTemp->rChild,data,pFind); } } void Assign(pTreeNode pTreeNodeTemp,int data) { if(pTreeNodeTemp->data != NULL) { pTreeNodeTemp->data = data; } } void GetRoot(pTreeNode pTreeNodeTemp,void (*print)(TElemType)) { if(pTreeNodeTemp != NULL) { print(pTreeNodeTemp->data); }else { print(-1); } } pTreeNode GetParent(pTreeNode pTreeNodeTemp,TElemType data) { Queue qTemp; pTreeNode pTreeNodeNew; if(pTreeNodeTemp != NULL) { InitQueue(&qTemp); EnQueue(&qTemp,pTreeNodeTemp);//先入队根节点 while(!IsQueueEmpty(qTemp)) { DeQueue(&qTemp,&pTreeNodeNew); if(pTreeNodeNew->lChild&&pTreeNodeNew->lChild->data==data || pTreeNodeNew->rChild&&pTreeNodeNew->rChild->data==data) { return pTreeNodeNew; }else { if(pTreeNodeNew->lChild) { EnQueue(&qTemp,pTreeNodeNew->lChild); } if(pTreeNodeNew->rChild) { EnQueue(&qTemp,pTreeNodeNew->rChild); } } } } DestroyQueue(&qTemp); return NULL; } pTreeNode GetPoint(pTreeNode pTreeNodeTemp,TElemType data) { Queue qTemp; pTreeNode pTreeNodeNew; if(pTreeNodeTemp != NULL) { InitQueue(&qTemp); EnQueue(&qTemp,pTreeNodeTemp); while(!IsQueueEmpty(qTemp)) { DeQueue(&qTemp,&pTreeNodeNew); if(pTreeNodeNew->data == data) { return pTreeNodeNew; } else { if(pTreeNodeNew->lChild) { EnQueue(&qTemp,pTreeNodeNew->lChild); } if(pTreeNodeNew->rChild) { EnQueue(&qTemp,pTreeNodeNew->rChild); } } } } DestroyQueue(&qTemp); return NULL; } pTreeNode GetLeftChild(pTreeNode pTreeNodeTemp,TElemType data) { if(pTreeNodeTemp != NULL) { pTreeNode pParentNode = GetPoint(pTreeNodeTemp,data); if(pParentNode && pParentNode->lChild) { return pParentNode->lChild; } } return NULL; } pTreeNode GetRightChild(pTreeNode pTreeNodeTemp,TElemType data) { if(pTreeNodeTemp != NULL) { pTreeNode pParentNode = GetPoint(pTreeNodeTemp,data); if(pParentNode && pParentNode->rChild) { return pParentNode->rChild; } } return NULL; } pTreeNode GetLeftSibling(pTreeNode pTreeNodeTemp,TElemType data) { if(pTreeNodeTemp != NULL) { pTreeNode pParent = GetParent(pTreeNodeTemp,data); if(pParent && pParent->lChild && pParent->rChild->data == data) { return pParent->lChild; } } return NULL; } pTreeNode GetRightSibling(pTreeNode pTreeNodeTemp,TElemType data) { if(pTreeNodeTemp != NULL) { pTreeNode pParent = GetParent(pTreeNodeTemp,data); if(pParent && pParent->rChild && pParent->lChild->data == data) { return pParent->rChild; } } return NULL; } void LevelTravel(pTreeNode pTreeNodeTemp) { Queue qTemp; pTreeNode pTreeNodeTravel; if(pTreeNodeTemp != NULL) { InitQueue(&qTemp); EnQueue(&qTemp,pTreeNodeTemp); while(!IsQueueEmpty(qTemp)) { DeQueue(&qTemp,&pTreeNodeTravel); cout<<pTreeNodeTravel->data<<" "; if(pTreeNodeTravel->lChild) { EnQueue(&qTemp,pTreeNodeTravel->lChild); } if(pTreeNodeTravel->rChild) { EnQueue(&qTemp,pTreeNodeTravel->rChild); } } } DestroyQueue(&qTemp); } bool InsertChild(pTreeNode pTreeNodeTemp,int flag,pTreeNode pTreeNew) { if(pTreeNodeTemp != NULL && pTreeNew != NULL && pTreeNew->rChild == NULL) { if(flag == 0)//左插 { pTreeNew->rChild = pTreeNodeTemp->lChild; pTreeNodeTemp->lChild = pTreeNew; }else//flag == 1。右插 { pTreeNew->rChild = pTreeNodeTemp->rChild; pTreeNodeTemp->rChild = pTreeNew; } return true; } return false; } bool DeleteChild(pTreeNode pTreeNodeTemp,int flag) { if(pTreeNodeTemp != NULL) { if(flag == 0)//删除左子树 { DestroyTree(&pTreeNodeTemp->lChild); }else//删除右子树 { DestroyTree(&pTreeNodeTemp->rChild); } return true; } return false; } void printNode(TElemType e) { cout<<"root = "; cout<<e<<" "; }