二叉搜索树

二叉搜索树的Find()、FindMax()、FindMin()、Insert()、Delete()

 

头文件:

//BinseaTree.h

struct
TreeNode{ int Data; struct TreeNode *Left; struct TreeNode *Right; }; typedef struct TreeNode *BinTree; typedef BinTree Position; BinTree Inset(BinTree, int); Position Find(BinTree, int); Position FinMin(BinTree); Position FinMax(BinTree); BinTree Delete(BinTree, int); void PreOrderTraversal(BinTree); BinTree BuildTree();

 

实现:

#include <stdio.h>
#include <stdlib.h>
#include "BinSeaTree.h"

//先序遍历 void PreOrderTraversal(BinTree BT) { if (BT){ printf("%d ", BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); } }
/*********************************
实现关键,就是在找到后如何把新建节点接
到,父节点后面。
实现发放是使用递归,在每次递归保存父节
点,用于接上儿子。
*********************************/
BinTree Insert(BinTree BT,
int x) { if (!BT){ BT= (BinTree)malloc(sizeof(struct TreeNode)); BT->Data = x; BT->Left = BT->Right = NULL; } else{ if (x < BT->Data) BT->Left = Insert(BT->Left, x); // else BT->Right = Insert(BT->Right, x); } return BT; }
Position Find(BinTree BT,
int x) { //递归实现 //if (!BT) // return NULL; //if (x < BT->Data) // return Find(BT->Left, x); //else if (x>BT->Data) // return Find(BT->Right, x); //else // return BT; //迭代实现 while (BT){ if (x<BT->Data) BT = BT->Left; else if (x>BT->Data) BT = BT->Right; else return BT; } return NULL; } Position FindMin(BinTree BT) { //递归实现 if (!BT) return NULL; if (!BT->Left) return BT; else return FindMin(BT->Left); //迭代实现 /*if (BT){ while (BT->Left) BT = BT->Left; } return BT;*/ } Position FindMax(BinTree BT) { //递归实现 /*if (!BT) return NULL; if (!BT->Right) return BT; else return FinMax(BT->Right); */ //迭代实现 if(BT){ while(BT->Right) BT = BT->Right; } return BT; } /*********************************
通过Insert()建立二叉搜索树
*********************************/
BinTree BuildTree() {
//二叉搜索树 BinTree T = NULL; int n; while (scanf_s("%d", &n) != EOF) T = Insert(T, n); return T; } /*************************************
  
关键是在找到后,节点有几个儿子

有两个时:找右子树最小的元素或找左子树最大的元素
替换父节点。再递归删除替代节点。
有一个时:直接用孙子替代儿子的位置
没有时:直接赋为空。
*************************************/
BinTree Delete(BinTree BT,int x) { Position Tmp; if (!BT) printf("未找到要删除的元素\n"); else { if (x < BT->Data) BT->Left = Delete(BT->Left, x); else if (x>BT->Data) BT->Right = Delete(BT->Right, x); else{ //被删节点有两个儿子 if (BT->Left&&BT->Right){ Tmp = FindMin(BT->Right); BT->Data = Tmp->Data; BT->Right = Delete(BT->Right, BT->Data); } //有一个或没有儿子 else{ Tmp = BT; if (!BT->Left) BT = BT->Right; else if (!BT->Right) BT = BT->Left; free(Tmp); } } } return BT; }

int main() { BinTree BT; BT = BuildTree(); PreOrderTraversal(BT); printf("\n"); printf("Please Enter a insert number: "); int n; scanf_s("%d", &n); BT=Insert(BT, n); PreOrderTraversal(BT); printf("\n"); BT=Delete(BT, n); PreOrderTraversal(BT); system("pause"); return 0; }

 

二叉搜索关键在查找,其它就看对递归的理解!!!!!!!!!!!!!!!!!

 

坚持!!!!!!!!!!!!!!!!!!

 

posted @ 2017-10-27 00:23  hytt-  阅读(561)  评论(0)    收藏  举报