码迷,mamicode.com
首页 > 编程语言 > 详细

二叉排序树

时间:2015-05-13 18:55:56      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

首先定义二叉树的存储结构

1 /* 二叉树的二叉链表结点结构定义 */
2 typedef char TreeElemType;
3 typedef struct tagBiTreeNode {
4     TreeElemType data;//结点数据
5     struct tagBiTreeNode *lchild, *rchild;//结点左右孩子指针
6 }BiTrNode, *BiTrNodePtr;

 

二叉排序树的查找函数实现如下:

 1 /*
 2 ** @brief 二叉排序树查找的递归实现
 3 ** @param 
 4 **     @arg root  : 根结点
 5 **     @arg key   : 待查找的关键字
 6 **     @arg parent: root节点的双亲结点,初始值为NULL
 7 **     @arg result: 查找结果中找到的结点指针
 8 ** @retval 如果查找成功,则result指向该元素结点并返回1;
 9 **        如果失败,则result指向查找路径上访问的最后一个节点。
10 */
11 int BST_Search(BiTrNodePtr root, TreeElemType key, BiTrNodePtr parent, BiTrNodePtr *result)
12 {
13     if (root == NULL){//查找不成功
14         *result = parent;
15         return 0;
16     }
17     if (key == root->data){//查找成功
18         *result = root;
19         return 1;
20     }else if (key < root->data){//被查找元素小于根结点元素
21         return BST_Search(root->lchild, key, root, result);//在左子树继续查找
22     }else{//被查找元素大于根结点元素
23         return BST_Search(root->rchild, key, root, result);//在右子树继续查找
24     }
25 }

在实现了查找的基础上,我们可以实现二叉查找树的插入(构造)函数:

 1 /*
 2 ** @brief  二叉排序树的插入
 3 ** @retval 当二叉树root中不存在关键字等于key的数据元素时,
 4 **         插入key并返回1;否则直接返回0
 5 */
 6 int BST_Insert(BiTrNodePtr *root, TreeElemType key)
 7 {
 8     BiTrNodePtr result = NULL, s = NULL;
 9     if (!BST_Search(*root, key, NULL, &result)){//查找不成功
10         s = (BiTrNodePtr)malloc(sizeof(BiTrNode));
11         s->data = key;
12         s->lchild = s->rchild = NULL;
13 
14         if (result == NULL){
15             *root = s;//插入节点s为新的根结点
16         }else if (key < result->data){
17             result->lchild = s;//插入结点s为左孩子
18         }else{
19             result->rchild = s;//插入结点s为右孩子
20         }
21 
22         return 1;//插入成功
23     }else{//树中已经存在关键字相同的结点,不再插入
24         return 0;//插入失败
25     }
26 }

为了验证,我们可以实现二叉树的中序遍历:

 1 /*
 2 ** 中序遍历二叉排序树
 3 */
 4 void BST_Traverse(BiTrNodePtr root, void (*visit)(BiTrNodePtr))
 5 {
 6     if (root == NULL) return;
 7     BST_Traverse(root->lchild, visit);
 8     visit(root);
 9     BST_Traverse(root->rchild, visit);
10 }

最后,我们给出一段测试代码:

 1 #include <stdio.h>
 2 #include "search.h"
 3 
 4 void visit(BiTrNodePtr e)
 5 {
 6     printf(" %c ", e->data);
 7 }
 8 
 9 int main(void)
10 {
11     BiTrNodePtr root = NULL;
12     TreeElemType key;
13 
14     scanf("%c", &key);
15     while (key != #){
16         BST_Insert(&root, key);
17         scanf("%c", &key);
18     }
19     BST_Traverse(root, visit);
20 
21     return 0;
22 }

 

二叉排序树

标签:

原文地址:http://www.cnblogs.com/xiaomanon/p/4500869.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!