//Tree.h
#ifndef TREE_H
#define TREE_H
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
#define OVERFLOW -2
#define SUCCESS 0
struct _Node
{
int iValue;
struct _Node* pParent;
struct _Node* pChildren;
struct _Node* pRSibling;
struct _Node* pLSibling;
};
typedef struct _Node Node;
typedef struct
{
Node* pRoot;//Root
int iDepth;//树的层数
int iSize;//树的结点数
int iLeaves;//树的叶子数 暂未使用
}Tree;
Tree* InitTree();
void ClearTree( Tree** pTree );
void DestroyTree( Tree** pTree );
int TreeEmpty( Tree* pTree );
int GetTreeDepth( Tree* pTree );
Node* GetRoot( Tree* pTree );
void Assign( Tree* pTree, Node* pNode, Node* pValue );
Node* GetParent( Tree* pTree, Node* pNode );
Node* GetLeftChild( Tree* pTree, Node* pNode );
Node* GetRightChild( Tree* pTree, Node* pNode );
Node* GetLeftSibling( Tree* pTree, Node* pNode );
Node* GetRightSibling( Tree* pTree, Node* pNode );
int InsertSiblingBefore( Tree* pTree, Node* pNode, Node* pValue );
int InsertChildBefore( Tree* pTree, Node* pNode, Node* pValue );
int InsertSiblingAfter( Tree* pTree, Node* pNode, Node* pValue );
void DeleteEntireNode( Node* pNode );
void DeleteNode( Tree* pTree, Node* pNode );
int AppendChild( Tree* pTree, Node* pNode, Node* pValue );
void PrintNode( Node* pNode );
void PreTraverseTree( Node* pNode );
void PostTraverseTree( Node* pNode );
Node* CreateNode( int iValue );
#endif
//Tree.c
#include "Tree.h"
Tree* InitTree()
{//初始化树
Tree* pTree = (Tree*)malloc( sizeof( Tree ) );
if( !pTree )
return NULL;
pTree->iDepth = 0;
pTree->iSize = 0;
pTree->iLeaves = 0;
pTree->pRoot = NULL;
return pTree;
}
Node* CreateNode( int iValue )
{
Node* pNode = (Node*)malloc( sizeof( Node ) );
if( !pNode )
return NULL;
pNode->pChildren = NULL;
pNode->pLSibling = NULL;
pNode->pParent = NULL;
pNode->pRSibling = NULL;
pNode->iValue = iValue;
return pNode;
}
void ClearTree( Tree** pTree )
{//清空 树
if( !(*pTree) )
return;
DeleteEntireNode( (*pTree)->pRoot );
(*pTree)->iSize = 0;
(*pTree)->iDepth = 0;
(*pTree)->iLeaves = 0;
(*pTree)->pRoot = NULL;
}
void DestroyTree( Tree** pTree )
{//销毁树
ClearTree( pTree );
free( *pTree );
*pTree = NULL;
}
int TreeEmpty( Tree* pTree )
{//测试树是否为空
if( !pTree || 0 == pTree->iSize )
return 0;
return pTree->iSize;
}
int GetTreeDepth( Tree* pTree )
{//树的深度
if( !pTree || 0 == pTree->iSize )
return 0;
return pTree->iDepth;
}
Node* GetRoot( Tree* pTree )
{//树的根
if( !pTree )
return NULL;
return pTree->pRoot;
}
void Assign( Tree* pTree, Node* pNode, Node* pValue )
{//给结点赋值
if( !pTree || 0 == pTree->iSize || !pNode || !pValue )
return;
pNode->iValue = pValue->iValue;
}
Node* GetParent( Tree* pTree, Node* pNode )
{//取结点的父结点
if( !pTree || 0 == pTree->iSize || !pNode )
return NULL;
return pNode->pParent;
}
Node* GetLeftChild( Tree* pTree, Node* pNode )
{//取结点pNode的最左端孩子
if( !pTree || 0 == pTree->iSize || !pNode || !pNode->pChildren )
return NULL;
return pNode->pChildren;
}
Node* GetRightChild( Tree* pTree, Node* pNode )
{//取结点pNode的最右端孩子
if( !pTree || pTree->iSize == 0 || !pNode->pChildren )
return NULL;
Node* pTmp = pNode->pChildren;
Node* pPrior = NULL;
while( pTmp )
{
pPrior = pTmp;
pTmp = pTmp->pRSibling;
}
return pPrior;
}
Node* GetLeftSibling( Tree* pTree, Node* pNode )
{//pNode的左侧兄弟
if( !pTree || 0 == pTree->iSize || !pNode || !pNode->pLSibling )
return NULL;
return pNode->pLSibling;
}
Node* GetRightSibling( Tree* pTree, Node* pNode )
{//pNode的右侧兄弟
if( !pTree || pTree->iSize == 0 || !pNode || !pNode->pRSibling )
return NULL;
return pNode->pRSibling;
}
int InsertSiblingBefore( Tree* pTree, Node* pNode, Node* pValue )
{//pNode之前插入结点pValue为pNode的左侧兄弟
if( !pTree || !pNode || !pValue )
return -1;
Node* pLSibling = GetLeftSibling( pTree, pNode );
if( pLSibling )
{
pLSibling->pRSibling = pValue;
pNode->pLSibling = pValue;
pValue->pLSibling = pLSibling;
pValue->pRSibling = pNode;
}
else
{
Node* pParent = GetParent( pTree, pNode );
if( !pParent )
return ERROR;
pParent->pChildren = pValue;
pValue->pLSibling = NULL;
pValue->pRSibling = pNode;
pNode->pLSibling = pValue;
}
return SUCCESS;
}
int InsertChildBefore( Tree* pTree, Node* pNode, Node* pValue )
{//在某个孩子结点之前插入结点
if( !pTree || 0 == pTree->iSize || !pNode || !pValue )
return -1;
if( !pNode->pLSibling )
{
pNode->pLSibling = pValue;
pValue->pLSibling = NULL;
pValue->pChildren = NULL;
pValue->pRSibling = pNode;
}
else
{
pNode->pLSibling->pRSibling = pValue;
pValue->pLSibling = pNode->pLSibling;
pValue->pRSibling = pNode;
pNode->pLSibling = pValue;
}
pValue->pParent = GetParent( pTree, pNode );
return 0;
}
int InsertSiblingAfter( Tree* pTree, Node* pNode, Node* pValue )
{//pNode之后插入pValue为后侧兄弟
if( !pTree || 0 == pTree->iSize || !pNode || !pValue )
return -1;
if( pNode->pRSibling )
{//有右兄弟
pNode->pRSibling->pLSibling = pValue;
pValue->pRSibling = pNode->pRSibling;
pNode->pRSibling = pValue;
pValue->pLSibling = pNode;
}
else
{//无右兄弟
pValue->pLSibling = pNode;
pValue->pChildren = NULL;
pValue->pRSibling = NULL;
pNode->pRSibling = pValue;
}
pValue->pParent = GetParent( pTree, pNode );
return 0;
}
void DeleteEntireNode( Node* pNode )
{
if( !pNode )
return;
Node* pCur = pNode->pChildren;
while( pCur )
{
pCur = pCur->pRSibling;
}
delete pNode;
}
void DeleteNode( Tree* pTree, Node* pNode )
{//删除pNode结点
if( !pTree || !pTree->iSize || !pNode )
return;
if( pNode->pLSibling )
{//存在左兄弟
if( pNode->pRSibling )
{
pNode->pLSibling->pRSibling = pNode->pRSibling;
pNode->pRSibling->pLSibling = pNode->pLSibling;
}
else
{
pNode->pLSibling->pRSibling = NULL;
}
}
else if( pNode->pRSibling )
{//存在右兄弟
Node* pParent = GetParent( pTree, pNode );
if( !pParent )
{
pParent->pChildren = pNode->pRSibling;
pParent->pChildren->pLSibling = NULL;
}
}
DeleteEntireNode( pNode );
}
int AppendChild( Tree* pTree, Node* pNode, Node* pValue )
{//追加孩子结点
if( !pTree || !pNode || !pValue )
return -1;
Node* pTmp = GetRightChild( pTree, pNode );
if( !pTmp )
{
pNode->pChildren = pValue;
}
else
{
pTmp->pRSibling = pValue;
pValue->pLSibling = pTmp;
}
pValue->pParent = pNode;
pTree->iSize++;
return 0;
}
void PrintNode( Node* pNode )
{//输出结点
if( pNode )
printf( "%d ", pNode->iValue );
}
void PreTraverseTree( Node* pNode )
{//前序遍历树
if( !pNode )
return;
PrintNode( pNode );//根
Node* pCur = pNode->pChildren;
while( pCur )
{
PreTraverseTree( pCur );
pCur = pCur->pRSibling;
}
}
void PostTraverseTree( Node* pNode )
{//后序遍历树
if( !pNode )
return;
Node* pCur = pNode->pChildren;
while( pCur )
{
PostTraverseTree( pCur );
pCur = pCur->pRSibling;
}
PrintNode( pNode );
}
int main( int argc, char* argv[] )
{
Tree* pTree = InitTree();
pTree->pRoot = CreateNode( 0 );
AppendChild( pTree, pTree->pRoot, CreateNode( 1 ) );
AppendChild( pTree, pTree->pRoot, CreateNode( 2 ) );
AppendChild( pTree, pTree->pRoot, CreateNode( 3 ) );
AppendChild( pTree, pTree->pRoot, CreateNode( 4 ) );
InsertChildBefore( pTree, GetRightChild( pTree, pTree->pRoot ), CreateNode( 5 ) );
InsertSiblingBefore( pTree, GetRightChild( pTree, pTree->pRoot ), CreateNode( 6 ));
puts( "后序" );
PostTraverseTree( pTree->pRoot );
puts( "" );
puts( "前序" );
PreTraverseTree( pTree->pRoot );
puts( "" );
puts( "左右兄弟" );
PrintNode( GetLeftSibling( pTree, GetRightChild( pTree, pTree->pRoot )));
puts( "" );
//删除最后一个结点
DeleteNode( pTree, GetRightChild( pTree, pTree->pRoot ) );
PreTraverseTree( pTree->pRoot );
puts( "Clear Tree..." );
ClearTree( &pTree );
DestroyTree( &pTree );
if( pTree )
PreTraverseTree( pTree->pRoot );
return 0;
}