zoukankan      html  css  js  c++  java
  • 二叉搜索树

    介绍:


            使二叉树成为二叉查找树的性质是:对于树中的每一个节点X,它的左子树中全部keyword值小于X的keyword值。而它的右子树中全部keyword值大于X的keyword值。


    二叉查找树声明

    struct TreeNode;
    typedef struct TreeNode *Position;
    typedef struct TreeNode *SearchTree;
    
    struct TreeNode{
    	ElementType Element;
    	SearchTree  Left;
    	SearchTree  Right;
    };
    

    建立一棵空树的例程

    SearchTree MakeEmpty(SearchTree T)
    {
    	if(T != NULL){
    		MakeEmpty(T->Left);	
    		MakeEmpty(T->Right);	
    		free(T);
    	}
    
    	return NULL;
    }
    

    二叉查找树的Find操作

    Position Find(ElementType X, SearchTree T)
    {
    	if(T == NULL)
    		return NULL;
    	if(X < T->Element)
    		return Find(X, T->Left);
    	else if(X > T->Element)
    		return Find(X, T->Right);
    	return T;
    }

    二叉查找树的FindMin递归与非递归实现

    Position FindMin(SearchTree T)
    {
    	if(T == NULL)
    		return NULL;	
    	else if(T->Left == NULL)
    		return T;
    	else 
    		return FindMin(T->Left);
    }
    
    Position FindMin(SearchTree T)
    {
    	if(T != NULL)
    		while(T->Left != NULL)
    			T = T->Left;	
    	return T;
    }
    

    二叉查找树的FindMax递归与非递归实现

    Position FindMax(SearchTree T)
    {
    	if(T == NULL)
    		return NULL;
    	else if(T->Right == NULL)
    		return T;
    	else 
    		return FindMax(T->Right);
    }
    
    Position FindMax(SearchTree T)
    {
    	if(T != NULL)
    		while(T->Right != NULL)		
    			T = T->Right;	
    	return T;
    }
    

    插入元素到二叉查找树的例程

    SearchTree Insert(ElementType X, SearchTree T)
    {
    	if(T == NULL){
    		T = (SearchTree)malloc(sizeof(struct TreeNode));	
    		if(T == NULL){
    			printf("Out of space.
    ");
    			return NULL;
    		}
    	}else if(X < T->Element){
    		T->Left = Insert(X, T->Left);	
    	}else (X > T->Element){
    		T->Right = Insert(X, T->Right);	
    	}
    
    	return T;
    }
    

    二叉查找树的删除例程

    SearchTree Delete(ElementType X, SearchTree T)
    {
    	Position TmpCell;
    
    	if(T == NULL){
    		fprintf(stderr,"Element not found.
    ");	
    		return NULL;
    	}else if(X < T->Element)
    		T->Left = Delete(X, T->Left);
    	else if(X > T->Element)
    		T->Right = Dlelte(X, T->Right);
    	else if(T->Left && T->Right){
    		TmpCell = FindMin(T->Right);	
    		T->Element = TmpCell->Element;
    		T->Right = Delete(T->Element, T->Right);
    	}else{
    		TmpCell = T;
    		if(T->Left == NULL)	
    			T = T->Right;
    		else if(T->Right == NULL)
    			T = T->Left;
    		free(TmpCell);
    	}
    
    	return T;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    VUE常用传值方式、父传子、子传父、非父子组件传值
    ios10中禁止用户缩放页面
    TCP MSS
    C++11 之 override
    unordered_set
    c++Lambda
    QUIC实现代码分析
    C++11新特性之十:enable_shared_from_this
    c++11 atomic
    How to Write a QUIC Endpoint Program
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4634956.html
Copyright © 2011-2022 走看看