数据结构----二叉搜索树

Posted hywhyme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构----二叉搜索树相关的知识,希望对你有一定的参考价值。

技术图片

 


 

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 百度百科

 

  • 函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针;
  • 函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;
  • 函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
  • 函数FindMin返回二叉搜索树BST中最小元结点的指针;

函数FindMax返回二叉搜索树BST中最大元结点的指针。



1
#include <stdio.h> 2 #include <stdlib.h> 3 4 5 6 7 8 typedef int ElementType; 9 10 typedef struct TNode * Position; 11 12 typedef Position BinTree; 13 14 struct TNode 15 16 ElementType Data; 17 BinTree Left; 18 BinTree Right; 19 ; 20 21 void PreorderTraversal( BinTree BT ) 22 if(BT) 23 printf(" %d ",BT->Data); 24 PreorderTraversal(BT->Left); 25 PreorderTraversal(BT->Right); 26 27 28 void InorderTraversal( BinTree BT ) 29 if(BT) 30 InorderTraversal(BT->Left); 31 printf(" %d ",BT->Data); 32 InorderTraversal(BT->Right); 33 34 35 /* 中序遍历,由裁判实现,细节不表 */ 36 37 BinTree Insert( BinTree BST, ElementType X ) 38 //printf("插入%d\\n",X); 39 BinTree new_node = NULL; 40 if(BST==NULL) 41 //printf("建立根\\n"); 42 BST = (Position)malloc(sizeof(struct TNode)); 43 BST->Data = X; 44 BST->Left = NULL; 45 BST->Right = NULL; 46 else 47 //printf("有根了\\n"); 48 if(X < BST->Data) 49 //printf("在根的左边\\n"); 50 if(BST->Left) 51 Insert(BST->Left,X); 52 else 53 BinTree new_node = (Position)malloc(sizeof(struct TNode)); 54 new_node->Data = X; 55 new_node->Left = NULL; 56 new_node->Right = NULL; 57 BST->Left = new_node; 58 59 else if(X > BST->Data) 60 //printf("在根的右边%d --- %d \\n",X,BST->Data); 61 if(BST->Right) 62 Insert(BST->Right,X); 63 else 64 BinTree new_node = (Position)malloc(sizeof(struct TNode)); 65 new_node->Data = X; 66 new_node->Left = NULL; 67 new_node->Right = NULL; 68 BST->Right = new_node; 69 70 71 72 return BST; 73 74 75 76 Position Find( BinTree BST, ElementType X ) 77 if(BST==NULL) 78 return NULL; 79 80 if(BST->Data==X) 81 return BST; 82 else if(X < BST->Data) 83 return Find(BST->Left,X); 84 else if(X > BST->Data) 85 return Find(BST->Right,X); 86 87 88 Position FindMin( BinTree BST ) 89 if(BST==NULL) 90 return NULL; 91 92 else if(BST->Left==NULL) 93 return BST; 94 95 else 96 return (FindMin(BST->Left)); 97 98 99 Position FindMax( BinTree BST ) 100 if(BST==NULL) 101 return NULL; 102 103 else if(BST->Right==NULL) 104 return BST; 105 106 else 107 return (FindMax(BST->Right)); 108 109 110 111 //删除节点 112 BinTree Delete( BinTree BST, ElementType X ) 113 Position temp; 114 if(BST==NULL) 115 printf("Not Found\\n"); 116 return BST; 117 118 else if(X < BST->Data) 119 BST->Left = Delete(BST->Left,X); 120 else if(X > BST->Data) 121 BST->Right = Delete(BST->Right,X); 122 else 123 if(BST->Left && BST->Right) 124 temp = FindMax(BST->Left); 125 BST->Data = temp->Data; 126 BST->Left = Delete(BST->Left,BST->Data); 127 else 128 temp = BST; 129 if(BST->Left) 130 BST = BST->Left; 131 else 132 BST = BST->Right; 133 134 free(temp); 135 136 return BST; 137 138 139 140 141 int main() 142 143 BinTree BST, MinP, MaxP, Tmp; 144 ElementType X; 145 int N, i; 146 BST = NULL; 147 scanf("%d", &N); 148 for ( i=0; i<N; i++ ) 149 scanf("%d", &X); 150 //printf("%d",X); 151 BST = Insert(BST, X); 152 153 printf("Preorder:"); PreorderTraversal(BST); printf("\\n"); 154 printf("Inorder:"); InorderTraversal(BST); printf("\\n"); 155 MinP = FindMin(BST); 156 MaxP = FindMax(BST); 157 scanf("%d", &N); 158 for( i=0; i<N; i++ ) 159 scanf("%d", &X); 160 Tmp = Find(BST, X); 161 if (Tmp == NULL) printf("%d is not found\\n", X); 162 else 163 printf("%d is found\\n", Tmp->Data); 164 if (Tmp==MinP) printf("%d is the smallest key\\n", Tmp->Data); 165 if (Tmp==MaxP) printf("%d is the largest key\\n", Tmp->Data); 166 167 168 scanf("%d", &N); 169 for( i=0; i<N; i++ ) 170 scanf("%d", &X); 171 BST = Delete(BST, X); 172 173 printf("Inorder:"); InorderTraversal(BST); printf("\\n"); 174 return 0; 175

技术图片

 

 

 

以上是关于数据结构----二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~高度平衡二叉树AVL树

直击网申系列直播:数据结构高频考点之二叉树二分搜索树二叉堆

数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~红黑树

二叉树二叉搜索树

二叉搜索树

算法漫游指北(第十三篇):二叉树的基本概念满二叉树完全二叉树二叉树性质二叉搜索树二叉树定义二叉树的广度优先遍历