构造一颗二叉排序树如下:

代码如下:
#include <stack>
#include <queue>
using namespace std;
template<typename T, typename Comp = less<T>>
class BSTree
{
public:
BSTree() :root_(nullptr) {}
~BSTree() {}
//非递归插入操作
void n_insert(const T& val)
{ //树为空,生成根节点
if (root_ == nullptr)
{
root_ = new Node(val);
return;
}
//搜索合适的插入位置,记录父节点的位置
Node* parent = nullptr;
Node* cur = root_;
while (cur != nullptr)
{
if (cur->data_ == val)
{
//不插入元素相同的值
return;
}
else if (comp_(cur->data_, val))
{
parent = cur;
cur = cur->right_;
}
else
{
parent = cur;
cur = cur->left_;
}
}
//新节点插入到parent节点的孩子上
if (comp_(val, parent->data_)) // val < parent->data_
{
parent->left_ = new Node(val);
}
else
{
parent->right_ = new Node(val);
}
}
private:
struct Node
{
Node(T data = T())
:data_(data)
, left_(nullptr)
, right_(nullptr)
{}
T data_;//数据域
Node* left_;//左孩子域
Node* right_;//右孩子域
};
Node* root_;//指向BST树的根节点
Comp comp_; //定义一个函数对象
};
int main()
{
int ar[] = { 58,24,67,0,34,62,69,5,41,64,78 };
BSTree<int>bst;
for (int v : ar)
{
bst.n_insert(v);
}
bst.n_insert(12);
return 0;
}调试结果如下:

插入节点12,12应为5的右孩子,思路为:
12小于58,此时parent指向58,cur指向58的左孩子24;
继续判断:12小于24,parent指向24,cur指向24的左孩子0;
继续判断:12大于0,parent指向0,cur指向0的右孩子5;
继续判断:12大于5,parent指向5,cur应指向5的右孩子(此时还没有创立节点);
此时创建新节点,赋其数据为12,并让5的右孩子指向该节点。
可看到插入成功:

版权声明:本文为weixin_46153828原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。