二叉查找树

刚把数据结构c语言描述的二叉查找树这一部分看完,书上的给出了函数的定义,我都实现了一遍,有递归的和非递归的两种,源代码贴上来,留作纪念了。源文件有比较详细的注释,但是在Live Writer里面显示是乱码,希望在网页上不是乱码

tree.h头文件内容:

#ifndef _Tree_H
#define _Tree_H

typedef int ElementType;

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;


SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X,SearchTree T);
Position Find_No(ElementType X,SearchTree T);
Position FindMin(SearchTree T);
Position FindMin_No(SearchTree T);
Position FindMax(SearchTree T);
Position FindMax_No(SearchTree T);
SearchTree Insert(ElementType X,SearchTree T);
SearchTree Insert_No(ElementType X,SearchTree T);
SearchTree Delete(ElementType X,SearchTree T);
SearchTree Delete_No(ElementType X,SearchTree T);
ElementType Retrieve(Position P);
ElementType Retrieve_No(Position P);
Position Find_Prev(ElementType X,SearchTree T);

#endif

struct TreeNode
{
    ElementType Element;
    SearchTree Left;
    SearchTree Right;
};

 

tree.c源文件的内容:

#include "tree.h"
#include 
   
    
#include 
    
      //???????? SearchTree MakeEmpty(SearchTree T) { if(T != NULL) { MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL; } //????X??????,?? 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; } //????X??????,??? Position Find_No(ElementType X,SearchTree T) { Position ret = NULL; if(T == NULL) return T; if(X == T->Element) return T; else if(X < T->Element) { Position p1 = T->Left;//???????,p1???? while (X != p1->Element) p1 = p1->Left; ret = p1; } else if(X > T->Element) { Position p2 = T->Right;//???????,p2???? while(X != p2->Element) p2 = p2->Right; ret = p2; } return ret; } //??????????,??? Position FindMin_No(SearchTree T) { if(T == NULL) return NULL; Position p = T->Left; Position cur = NULL; while(p != NULL) { cur = p; p = p->Left; } return cur; } //??????????,?? Position FindMin(SearchTree T) { if(T == NULL) return NULL; else if(T->Left == NULL) return T; else return FindMin(T->Left); } //??????????,??? Position FindMax_No(SearchTree T) { if(T == NULL) return NULL; Position p = T->Right; Position cur = NULL; while(p != NULL) { cur = p; p = p->Right; } return cur; } //??????????,?? Position FindMax(SearchTree T) { if(T == NULL) return NULL; else if(T->Right == NULL) return T; else return FindMax(T->Right); } //?? SearchTree Insert(ElementType X,SearchTree T) { Position p1 = NULL; Position p2 = NULL; if(T == NULL) { T = (SearchTree)malloc(sizeof(TreeNode)); if(T != NULL) { T->Element = X; T->Left = NULL; T->Right = NULL; } else return NULL; } else { Position node; node = (Position)malloc(sizeof(TreeNode)); node->Element = X; node->Left = NULL; node->Right = NULL; if(X < T->Element) { p1 = T->Left; Position cur = NULL; while(p1 != NULL) { if(X < p1->Element) { cur = p1; p1 = p1->Left; } else if(X > p1->Element) { cur = p1; p1 = p1->Right; } else return p1; } if(X > cur->Element) cur->Right = node; else cur->Left = node; } else if(X > T->Element) { p2 = T->Right; Position cur = NULL; while(p2 != NULL) { if(X < p2->Element) { cur = p2; p2 = p2->Left; } else if(X > p2->Element) { cur = p2; p2 = p2->Right; } else return p2; } if(X > cur->Element) cur->Right = node; else cur->Left = node; } } return T; } //????X?????????,??? Position Find_Prev(ElementType X,SearchTree T) { if(T == NULL) return T; if(X < T->Element) { Position p1 = T->Left; while (X != p1->Element) p1 = p1->Left; return p1; } else if(X > T->Element) { Position p2 = T->Right; while(X != p2->Element) p2 = p2->Right; return p2; } else return T; } //?????? SearchTree Delete(ElementType X,SearchTree T) { Position X_pos = NULL; Position ret = NULL; if(T == NULL) return NULL; X_pos = Find(X,T); if(X_pos == NULL) return NULL; if(X_pos->Left == NULL && X_pos->Right == NULL)//??????????,??????? { ret = X_pos; free(X_pos); X_pos = NULL; } else if(X_pos->Left == NULL || X_pos->Right == NULL)//??????? { Position prev = Find_Prev(X,T);//???????????? if(prev->Right == X_pos)//????????????? { //????????????????????????? if(X_pos->Right != NULL) prev->Right = X_pos->Right; else if(X_pos->Left != NULL) prev->Right = X_pos->Left; } else if(prev->Left == X_pos) { if(X_pos->Right != NULL) prev->Left = X_pos->Right; else if(X_pos->Left != NULL) prev->Left = X_pos->Left; } free(X_pos);//?????????,?X_pos??NULL X_pos = NULL; } else if(X_pos->Left != NULL && X_pos->Right != NULL)//??????? { Position ptr_min = FindMin_No(X_pos->Right);//?????????????????? X_pos->Element = ptr_min->Element; Position ptr_min_prev = Find_Prev(ptr_min->Element,X_pos->Right); if(ptr_min_prev->Right == ptr_min) { if(ptr_min->Right != NULL) ptr_min_prev->Right = ptr_min->Right; else if(ptr_min->Left != NULL) ptr_min_prev->Right = ptr_min->Left; } else if(ptr_min_prev->Left == ptr_min) { if(ptr_min->Right != NULL) ptr_min_prev->Left = ptr_min->Right; else if(ptr_min->Left != NULL) ptr_min_prev->Left = ptr_min->Left; } free(X_pos); X_pos = NULL; } return T; } void Output(SearchTree T) { if(T != NULL) { printf("%d /n",T->Element); Output(T->Left); Output(T->Right); } } int main() { SearchTree T = NULL; T = (SearchTree)malloc(sizeof(struct TreeNode)); struct TreeNode Node1; struct TreeNode Node2; struct TreeNode Node3; struct TreeNode Node4; struct TreeNode Node5; Node1.Element = 1; Node2.Element = 2; Node3.Element = 3; Node4.Element = 4; Node5.Element = 8; T->Element = 6; T->Left = &Node2; T->Right = &Node5; Node5.Left = NULL; Node5.Right = NULL; Node1.Left = NULL; Node1.Right = NULL; Node3.Left = NULL; Node3.Right = NULL; Node2.Left = &Node1; Node2.Right = &Node4; Node4.Left = &Node3; Node4.Right = NULL; Output(T); SearchTree Tptr; int val = 7; Tptr = Insert(val,T); Output(T); Position min; min = FindMin_No(T); printf("/n%d/n",min->Element); Position max; max = FindMax_No(T); printf("/n%d/n",max->Element); return 0; }
    
   

你可能感兴趣的:(struct,tree,null,delete,insert,output)