目录
二叉排序树(Binary Sort Tree)
前置条件:
#include<iostream>
using namespace std;
typedef int KeyType;
typedef int InfoType;
struct ElemType
{
KeyType key; //关键字
InfoType otherinfo; //其他数据域
};
struct BSTNode
{
ElemType data; //数据域
struct BSTNode* lchild, * rchild; //左右孩子指针
};
typedef BSTNode * BSTree;
BSTree T; //定义二叉排序树T
二叉排序查找(递归算法)
运行框架/构建思路:
//若树为空,返回空
// 后面转念一想,空树也是这个二叉树类型,所以为空就像和成功一样,直接输出
//比较key和根节点
// 成功:输出//失败:大于看右子树,小于看左子树
//循环重复该操作
程序实现:
BSTree SearchBST(BSTree T, KeyType key)
{
//若树为空,返回空
// 后面转念一想,空树也是这个二叉树类型,所以为空就像和成功一样,直接输出
//比较key和根节点
// 成功:输出
if ((key == T->data.key) || (!T))
return T;
//失败:大于看右子树,小于看左子树
else if (key > T->data.key)
{
T = T->rchild;
return SearchBST(T, key);
}
else if (key < T->data.key)
{
T = T->rchild;
return SearchBST(T, key);
}
//循环重复该操作
}
标准答案:
就是把:
T = T->rchild;
return SearchBST(T, key);
合并为一步:
return SearchBST(T->rchild, key); //在右子树继续查找
BSTree SearchBST(BSTree T, KeyType key)
{
if ((key == T->data.key) || (!T))
return T;
else if (key > T->data.key)
return SearchBST(T->lchild, key);
else
return SearchBST(T->rchild, key);
}
二叉排列树的插入
//二叉排列树的插入
void InsertBSTree(BSTree& T, ElemType& e)
{
if (!T)
{
T =new BSTNode;
T->data = e;
}
if (T->data.key == e.key);
//已有该元素,退出
else if (e.key > T->data.key)
InsertBSTree(T->rchild, e);
else if (e.key < T->data.key)
InsertBSTree(T->lchild, e);
}
二叉排列树的删除
较为复杂
二叉排列树的生成
// 二叉排列树的生成
void CreatBSTree(BSTree & T)
{
//输入序列(也可以从形参传入)
cout << "input info about the tree" << endl;
vector<ElemType> vec;
ElemType input;
while (cin >> input.key)
{
vec.push_back(input);
}
//调用插入算法
for (vector<ElemType>::iterator it = vec.begin(); it != vec.end(); ++it)
{
InsertBSTree(T, *it);
}
}