c++ 二叉搜索树的创建 代码解释

二叉搜索树的定义:

二叉树中每一个节点:
若其左子树存在,则其左子树中每个节点的值都小于该节点值,
若其右子树存在,则其右子树中每个节点的值都大于该节点值。
没有键值相等的节点。

如果想了解更多二叉搜索树的定义:数据结构(二):二叉搜索树(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、代码其实可以把函数弄到类中成为方法的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值