二叉搜索树
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;
}