二叉搜索树的定义:
二叉树中每一个节点:
若其左子树存在,则其左子树中每个节点的值都小于该节点值,
若其右子树存在,则其右子树中每个节点的值都大于该节点值。
没有键值相等的节点。
如果想了解更多二叉搜索树的定义:数据结构(二):二叉搜索树(Binary Search Tree)
二叉搜索树主要是用来查找和排序的,
查找的时间复杂度o(logn) ~ o(n) ,
排序只要中序遍历一遍就可以得到有序的序列。
代码:
#include<iostream>
using namespace std;
#define DataType int
class BSTreeNode
{
DataType data;
BSTreeNode* left;
BSTreeNode* right;
public:
BSTreeNode()
{
data = INT_MIN;
left = NULL;
right = NULL;
}
BSTreeNode(DataType& d) :data(d), left(NULL), right(NULL) {}
DataType GetData() const
{
return data;
}
void SetData(const DataType& d)
{
data = d;
}
BSTreeNode* GetLeft()
{
return left;
}
BSTreeNode* GetRight()
{
return right;
}
void SetLeft(BSTreeNode*& newLeft)
{
left = newLeft;
}
void SetRight(BSTreeNode*& newRight)
{
right = newRight;
}
};
void CreateBSTree(BSTreeNode*& treeRoot)
{
cout << "输入一串数字以空格分隔创建搜索二叉树:" << endl;
DataType tData;
while (cin >> tData)
{
//声明临时节点并把数据放进去,注意不能delete
BSTreeNode* newNode = new BSTreeNode(tData);
//树没有根结点的情况
if (treeRoot == NULL)
{
treeRoot = newNode;
}
//树存在根节点
else
{
//声明移动指针
BSTreeNode* pTemp = treeRoot;
//找到插入的位置才退出
while (true)
{
//输入的数小于该节点的值
if (tData < pTemp->GetData())
{
//左孩子为空,则新的节点为左孩子
if (pTemp->GetLeft() == NULL)
{
pTemp->SetLeft(newNode);
break;
}
//左孩子不为空,p指针移动为左孩子
else
{
pTemp = pTemp->GetLeft();
}
}
//输入的数不小于该节点的值
else
{
//右孩子为空,则新的节点为右孩子
if (pTemp->GetRight() == NULL)
{
pTemp->SetRight(newNode);
break;
}
//右孩子不为空,p指针移动为右孩子
else
{
pTemp = pTemp->GetRight();
}
}
}
}
//判断是否输入结束
if (cin.get() == '\n')
break;
}
}
//遍历顺序:根左右
void PreOrder(BSTreeNode* everyTreeNode)
{
if (everyTreeNode)
{
cout << everyTreeNode->GetData() << " ";
PreOrder(everyTreeNode->GetLeft());
PreOrder(everyTreeNode->GetRight());
}
}
//遍历顺序:左根右
void InOder(BSTreeNode* everyTreeNode)
{
if (everyTreeNode)
{
InOder(everyTreeNode->GetLeft());
cout << everyTreeNode->GetData() << " ";
InOder(everyTreeNode->GetRight());
}
}
//遍历顺序:左右根
void PostOrder(BSTreeNode* everyTreeNode)
{
if (everyTreeNode)
{
PostOrder(everyTreeNode->GetLeft());
PostOrder(everyTreeNode->GetRight());
cout << everyTreeNode->GetData() << " ";
}
}
int main()
{
//声明树的根节点
BSTreeNode* tree = NULL;
//创建二叉搜索树
CreateBSTree(tree);
cout << endl << "先序递归遍历二叉树" << endl;
PreOrder(tree);
cout << endl << "中序递归遍历二叉树" << endl;
InOder(tree);
cout << endl << "后序递归遍历二叉树" << endl;
PostOrder(tree);
return 0;
}
输入输出:
- 可以看到中序遍历就是有序的
最后:
1、二叉搜索树的创建和二叉树的先序中序后序创建不同的点是它不用把二叉树转换成扩展二叉树输入。
2、代码其实可以把函数弄到类中成为方法的。