二叉搜索树

二叉搜索树

C++实现在这里插入图片描述

#include<queue>
#include<iostream>
#include<vector>
using namespace std;
const int arrrlens = 8;
int arr[arrrlens] = { 10, 5, 4, 9, 11, 20, 8, 15 };
/*二叉搜索树满足:一个节点的左节点值小于这个节点的,右节点值大于这个节点*/
class Node {
public:

	Node(int el = 0, Node* l=NULL, Node* r=NULL) {
		data = el;
		left = l;
		right = r;
	}
	int data;
	Node* left, *right;
};
class Tree {
public:

	Tree() { root = NULL; }
	~Tree() { delete root; }
	int preOrder(Node*);
	int create();
	int find(int);
	vector<vector<int>> levelTraversal(Node*);
	bool __insert(Node*&, int val);
	bool insert(Node*& , int val);
	int del(int);
public:
	Node* root;
};
//先序遍历打印
int Tree::preOrder(Node* root)
{
	if (root != NULL)
	{
		cout << root->data << " ";
		preOrder(root->left);
		preOrder(root->right);
	}
	return 0;
}
//节点查找
int Tree::find(int key)
{
	Node* p = root;
	while ( p != NULL)
	{
		if (p->data > key)
			p = p->left;
		else if (p->data < key)
			p = p->right;
		else
			return 1;
	}
	return 0;
}
//层次遍历
vector<vector<int>> Tree::levelTraversal(Node* root)
{
	queue<Node*> inputQ;
	vector<vector<int>> ans;
	if (root == NULL)
		return ans;
	inputQ.push(root);
	while (!inputQ.empty())
	{
		vector<int> temp;
		int len = inputQ.size();
		for (int i = 0; i < len; i++)
		{
			Node* p = inputQ.front();
			inputQ.pop();
			temp.push_back(p->data);
			if (p->left)
				inputQ.push(p->left);
			if (p->right)
				inputQ.push(p->right);
		}
		ans.push_back(temp);
	}
	return ans;
}
//非递归插入法
bool Tree::__insert(Node*& root, int val)
{
	Node* newnode = new Node(val);
	Node* cur = root, *pre = NULL;
	if (root == NULL)
	{ 
		root = newnode;
		return  true;
	}
	while (cur != NULL)
	{
		pre = cur;
		if (cur->data == val)
			return false;
		if (cur->data > val)
			cur = cur->left;
		else 
			cur = cur->right;
	}
	if (pre->data < val)
		pre->right = newnode;
	else
		pre->left = newnode;
	return true;
}
//递归插入法
bool Tree::insert(Node* &root, int val)
{
	if (root == NULL)
	{
		root = new Node(val);
		return true;
	}
	if (val == root->data)
		return false;
	if (val < root->data)
		insert(root->left, val);
	else
		insert(root->right, val);
	return true;
}
//通过每次调用插入方法创建二叉树搜索树
int Tree::create()
{
	for (int i = 0; i < arrrlens; i++)
		__insert(root, arr[i]);
	return 0;
}

int main()
{
	Tree tree;
	tree.create();
	tree.preOrder(tree.root);
	cout << endl << tree.find(20) << endl;
	vector<vector<int>> ans = tree.levelTraversal(tree.root);
	_reverse_iterator(ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值