• 二叉排序树


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



  • 相关阅读:
    关于机器人流量对抗的一点感想
    保卫"木叶",从火影剧情看网站攻防的演变
    自动化工具层级图
    对抗恶意机器人/自动化行为的新思路与方案
    C++ 数组、链表和二叉树的比较
    #ifndef和#define区别
    xavier上安装teamviewer
    Ubuntu16.04 下有关conda虚拟环境的一些使用方法
    vector中push_back和emplace_back的区别
    int、int16、int32、int64、float、float16、float32、float64
  • 原文地址:https://www.cnblogs.com/riskyer/p/3221729.html
Copyright © 2020-2023  润新知