C++:二叉树查找的实现(一)——插入操作

    二叉查找树,又称二叉排序树,是具有下列性质的二叉树

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

   (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

   (3)左、右子树也分别为二叉排序树;

    (4)没有键值相等的节点。

   图1就是一个典型的二叉查找树:

  

      对二叉查找树的操作包括建立、插入、查找、遍历、删除,首先来看看建立与插入。

      与链表类似,建立二叉查找树,首先要建立节点类,二叉树的结点类包括三个成员:元素,左结点指针以及右结点指针。实现程序如下:

class BtreeNode
{

public:
	int ele;
	BtreeNode *left;
	BtreeNode *right;
	BtreeNode();
	BtreeNode(int ele1, BtreeNode *l, BtreeNode *r);
};
BtreeNode::BtreeNode()//构造函数1
{
	this->ele = 0;
	this->left = nullptr;
	this->right = nullptr;

}
BtreeNode::BtreeNode(int ele1, BtreeNode *l, BtreeNode *r)//构造函数2
{
	this->ele = ele1;
	this->left = l;
	this->right = r;
}

       这里注意BtreeNode的成员需要声明成public,因为之后的派生类需要用到这些成员,只要保证之后用到这些成员的函数都是私有的那么仍然没有违反封闭原则。

     建立好结点后就是建立二叉树的过程,首先我们看一下二叉树的类:

class Btree
{
private:	
	BtreeNode *root;
    void insert(int ele2,BtreeNode * &inp);//insert1
public:
	Btree();
	void insert(int ele3);//insert2
	
};

     这里我们定义了两个insert函数,就是为了保证BtreeNode中成员的封闭性,insert2是public型的成员,但是并没有直接调用BtreeNode里的成员,调用成员的事情是由insert1完成的,而insert1是private的。

    然后我们看一下插入函数:

void Btree::insert(int ele3,BtreeNode *&inp)
{ 
	
	if (inp == nullptr)
	{

		inp=new BtreeNode(ele2, nullptr, nullptr);
	}
	else if (inp->ele < ele2)
		{
			//inp = inp->right;
			insert(ele2, inp->right);
		}
	else if (inp->ele>ele2)
		{
			//inp = inp->left;
			insert(ele2, inp->left);

		}
	
	else  //不插入重复元素
	{


	}
}

    这里有几个需要关注的地方;

(1)插入时如果一开始整个树是空的,我们要另外处理,只要生成一个新结点将该结点作为root结点就可以了(注意此处的描述,是将新节点地址给root)

(2)注意insert里调用的是BtreeNode* &inp而不是BtreeNode *inp,这里要理解起来可能有些困难,这里涉及到函数形参与实参问题,我们都知道如果需要通过函数改变某个变量的值,那么我们需要传递给函数的应该是该变量的地址而不是变量本身,那么我们可以分析一下,我们需要通过insert改变的是什么的值。有些人可能会回答当然是修改root指向的结点的值,这也是我一开始的观点,所以觉得应该使用BtreeNode* inp,但是可以想一下如果是这样做的话,我们相当于是在不断地修改root结点的值,这并不是我们想看到的,我们真正要做的是产生一个个新的结点将他们作为新的root结点(这里还设计到递归,会将新产生的结点自动连接上一层的root结点,直到回到最初的根节点),因此我们要改变的是root的地址,自然要定义指向root指针的指针也就是二级指针(程序中引用的效果等同于指针)

(3)注意程序中被注释的部分,不能这么写,因为这样会改变整个树的根节点。

     

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值