二叉搜索树与二分查找--05-预备二叉搜索树

基本结构

二叉搜索树(Binary Search Tree),它是一颗具有下列性质的二叉树:

  1. 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
  2. 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  3. 左、右子树也分别为二叉搜索树。
  4. 等于的情况只能出现在左子树或右子树中的某一侧。

由于二叉查找树的中序遍历是从小到大的,故又名二叉排序树(Binary Sort Tree)。

插入节点

 

将某节点(insert_node),插入至以node为根二叉查找树中:

  • 如果insert_node节点值小于当前node节点值:
    • 如果node有左子树,则递归的将该节点插入至左子树为根二叉排序树中。
    • 否则,将node->left赋值为该节点地址
  • 否则(大于等于情况):
    • 如果node有右子树,则递归的将该节点插入至右子树为根二叉排序树中
    • 否则,将node->right赋值为该节点地址
//中序遍历
void middleOrder(TreeNode* node) { 
	if (!node)
		return;
	middleOrder(node->left);
	cout << node->val << endl; 
	middleOrder(node->right);
}

//插入节点
void BST_insert(TreeNode* node, TreeNode* insert_node) {
	//判断左子树
	if (insert_node->val < node->val) {
		if(node->left) //左子树存在
			BST_insert(node->left, insert_node);
		else //左子树为空时
			node->left = insert_node;
	}
	//判断右子树
	else { 
		if (node->right) //右子树存在
			BST_insert(node->right, insert_node);
		else //右子树为空时
			node->right = insert_node;
	}
}

void test02() 
{
	TreeNode root(8); //以8为跟
	vector<TreeNode*> node_vec;
	int test[] = { 3, 10, 1, 6, 25 };
	for (int i = 0; i < 5; i++)
		node_vec.push_back(new TreeNode(test[i]));
	for (int i = 0; i < node_vec.size(); i++)
		BST_insert(&root, node_vec[i]);
	middleOrder(&root);
	
}

查找数值

查找数值value是否在二叉查找树中出现:

  • 如果 value等于当前查看node的节点值:返回真。
  • 如果value节点值小于当前node节点值:
    • 如果当前节点有左子树,继续在左子树中查找该值;否则,返回假。
  • 否则(value节点值大于当前node节点值):
    • 如果当前节点有右子树,继续在右子树中查找该值;否则,返回假。
//查找结点
bool BST_search(TreeNode* node, int val) {
	if (node->val == val)
		return true;
	//寻找左子树
	if (val < node->val) {
		if (node->left)
			BST_search(node->left, val);
		else
			return false;
	}
	//寻找右子树
	else {
		if (node->right)
			BST_search(node->right, val);
		else
			return false;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值