zoukankan      html  css  js  c++  java
  • 二叉排序树

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



  • 相关阅读:
    eclipse 注释模板
    解决win7访问不了局域网共享文件
    java 执行command
    解决Unable to reach a settlement: [diffie-hellman-group1-sha1, diffie-hellman-group-exchange-sha1] and [curve25519-sha256@li
    解决java.lang.UnsupportedClassVersionError
    hadoop命令备忘
    intellij 提交代码到git
    java用代理访问
    解决 jersey javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    解决Unable to locate Kerberos realm
  • 原文地址:https://www.cnblogs.com/aukle/p/3223620.html
Copyright © 2011-2022 走看看