树的基本操作

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


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值