• 二叉排序树


    //BSTSearch.h
    
    //Binary Search Tree
    
    #ifndef BSTSEARCH_H
    #define BSTSEARCH_H
    
    #include <stdio.h>
    #include <stdlib.h>
    #define true 1
    #define false 0
    #define ERROR 2
    #define NOT_FOUND 3
    
    #pragma pack( push )
    #pragma pack( 4 )
    
    struct Node
    {
    	int iValue;
    	struct Node* pLeft;
    	struct Node* pRight;
    	struct Node* pParent;
    };
    typedef struct Node Node;
    
    typedef struct
    {
    	struct Node* pRoot;
    }Header;
    
    #pragma pack( pop )
    
    Node* BSTSearch( Node* pNode, int iValue );
    int BSTDel( Header* pHeader, int iValue );
    Node* CreateNode( int iValue );
    Header* CreateBSTTree();
    void PrintNode( Node* pNode );
    
    #endif
    


    //BSTSearch.cpp
    
    #include "BSTSearch.h"
    
    Node* BSTSearch( Node* pNode, int iValue )
    {
    	if( !pNode )
    		return NULL;
    
    	if( pNode->iValue == iValue )
    		return pNode;
    	else if( iValue < pNode->iValue )
    	{
    		BSTSearch( pNode->pLeft, iValue );
    	}
    	else
    	{
    		BSTSearch( pNode->pRight, iValue );
    	}
    
    }
    
    bool BSTInsert( Header* pHeader, int iValue )
    {
    	if( !pHeader || !pHeader->pRoot )
    		return false;
    
    	if( BSTSearch( pHeader->pRoot, iValue ) )
    	{//已找到无需再安装
    		return false;
    	}
    
    	Node* pCur = pHeader->pRoot;
    	Node* pPrior = NULL;
    
    	while( pCur )
    	{
    		pPrior = pCur;
    
    		if( pCur->iValue > iValue )
    		{
    			pCur = pCur->pLeft;
    		}
    		else
    		{
    			pCur = pCur->pRight;
    		}
    	}
    
    	if( pPrior->iValue > iValue )
    	{
    		pPrior->pLeft = CreateNode( iValue );
    		pPrior->pLeft->pParent = pPrior;
    	}
    	else
    	{
    		pPrior->pRight = CreateNode( iValue );
    		pPrior->pRight->pParent = pPrior;
    	}
    
    	return true;
    }
    
    int BSTDel( Header* pHeader, int iValue )
    {
    	if( !pHeader )//error
    		return ERROR;
    
    	Node* pNode = BSTSearch( pHeader->pRoot, iValue );
    
    	if( !pNode )
    	{//未找到
    		return NOT_FOUND; 
    	}
    
    	Node* pParent = NULL;
    
    	if( !pNode->pLeft && !pNode->pRight )
    	{//叶子结点
    		pParent = pNode->pParent;
    
    		if( !pParent )
    		{//只有一个结点的树
    			free( pNode );
    			pHeader->pRoot = NULL;
    
    			return true;
    		}
    
    		if( pParent->pLeft == pNode )
    		{
    			pParent->pLeft = NULL;
    		}
    		else
    		{
    			pParent->pRight = NULL;
    		}
    
    		free( pNode );
    	}
    	else if( (!pNode->pLeft && pNode->pRight) || (pNode->pLeft && !pNode->pRight) )
    	{//只有左或右子树
    		if( pNode->pLeft )
    		{
    			pParent = pNode->pParent;
    
    			if( !pParent )
    			{
    				pHeader->pRoot = pNode->pLeft;
    				pNode->pLeft->pParent = NULL;
    
    				free( pNode );
    
    				return true;
    			}
    
    			if( pParent->pLeft == pNode )
    			{
    				pParent->pLeft = pNode->pLeft;
    				pNode->pParent = pParent->pLeft;
    			}
    			else
    			{
    				pParent->pRight = pNode->pLeft;
    				pNode->pParent = pParent->pRight;
    			}
    
    		}
    		else
    		{//右子树
    			pParent = pNode->pParent;
    
    			if( !pParent )
    			{
    				pHeader->pRoot = pNode->pRight;
    				pNode->pRight->pParent = NULL;
    
    				free( pNode );
    
    				return true;
    			}
    
    			if( pParent->pLeft == pNode )
    			{
    				pParent->pLeft = pNode->pRight;
    				pNode->pParent = pParent->pLeft;
    			}
    			else
    			{
    				pParent->pRight = pNode->pRight;
    				pNode->pParent =pParent->pRight;
    			}
    		}
    
    		free( pNode );
    	}
    	else if( pNode->pLeft && pNode->pRight )
    	{//左右子树全存在则把左子树作为其父结点的子结点把其右结点作为其左子树的最右下角子嗣结点
    		Node* pLeft = pNode->pLeft;
    		Node* pRight = pNode->pRight;
    
    		pParent = pNode->pParent;
    
    		if( !pParent )
    		{
    			pHeader->pRoot = pNode->pLeft;
    		}
    
    		Node* pCur = pNode->pLeft;
    		Node* pPrior = pCur;
    		while( pCur )
    		{
    			pPrior = pCur;
    			pCur = pCur->pRight;
    		}
    
    		if( pPrior )
    		{
    			pPrior->pRight = pRight;
    			pRight->pParent = pPrior;
    		}
    		else
    			return false;
    
    	}
    
    	return true;
    }
    
    Node* CreateNode( int iValue )
    {
    	Node* pNode = (Node*)malloc( sizeof( Node ));
    
    	if( !pNode )
    		return NULL;
    
    	pNode->iValue = iValue;
    	pNode->pLeft = NULL;
    	pNode->pRight = NULL;
    	pNode->pParent = NULL;
    
    	return pNode;
    }
    
    Header* CreateBSTTree()
    {
    	Header* pHeader = (Header*)malloc( sizeof( Header  ) );
    
    	if( !pHeader )
    		return NULL;
    
    	pHeader->pRoot = CreateNode(  3 );
    
    	Node* pCur = pHeader->pRoot;
    	pCur->pLeft = CreateNode( 1 );
    	pCur->pLeft->pParent = pCur;
    
    	pCur->pLeft->pLeft = CreateNode( 0 );
    	pCur->pLeft->pLeft->pParent = pCur->pLeft;
    
    	pCur->pLeft->pRight = CreateNode( 2 );
    	pCur->pLeft->pRight->pParent = pCur->pLeft;
    
    	pCur->pRight = CreateNode( 4 );
    	pCur->pRight->pParent = pCur;
    
    	pCur->pRight->pRight = CreateNode( 5 );
    	pCur->pRight->pRight->pParent = pCur->pRight;
    
    	pCur->pRight->pRight->pRight = CreateNode( 6 );
    	pCur->pRight->pRight->pRight->pParent = pCur->pRight->pRight;
    
    	return pHeader;
    }
    
    void PrintNode( Node* pNode )
    {
    	if( pNode )
    		printf( "%d
    ", pNode->iValue );
    }
    
    int main( int argc, char* argv[] )
    {
    	Header* pHeader = CreateBSTTree();
    
    	PrintNode( BSTSearch( pHeader->pRoot, 3 ));
    
    	int iRes = BSTInsert( pHeader, 7 );
    
    	PrintNode( BSTSearch( pHeader->pRoot, 7 ));
    
    	if( true == BSTDel( pHeader, 3 ) )
    	{
    		puts( "true" );
    		PrintNode( BSTSearch( pHeader->pRoot, 7  ));
    	}
    	
    	PrintNode( BSTSearch( pHeader->pRoot, 3 ));
    	PrintNode( BSTSearch( pHeader->pRoot, 4 ));
    	PrintNode( BSTSearch( pHeader->pRoot, 5 ));
    
    
    	return 0;
    }



  • 相关阅读:
    史上最完整的Android开发工具集合(转)
    史上最完整的Android开发工具集合(转)
    JSP取得绝对路径
    ExecutorService 的理解与使用
    JAVA多线程实现的三种方式 ()
    高并发策略实例分析
    spring framework体系结构及内部各模块jar之间的maven依赖关系
    js 去掉下划线,后首个字母变大写
    Cron表达式
    eclipse中怎么找项目部署的路径和找编译后的class路径
  • 原文地址:https://www.cnblogs.com/aukle/p/3223620.html
Copyright © 2020-2023  润新知