前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉排序树的创建和插入----二叉查找树

二叉排序树的创建和插入----二叉查找树

作者头像
大忽悠爱学习
发布2021-04-02 09:57:01
6720
发布2021-04-02 09:57:01
举报
文章被收录于专栏:c++与qt学习c++与qt学习

二叉排序树概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c++类的定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉排序树的插入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉排序树的构造

在这里插入图片描述
在这里插入图片描述

下面演示两种不同的方式实现二叉树的插入和构建

法1:

代码语言:javascript
复制
#include<iostream>
using namespace std;
struct BiNode {
	int data;
	BiNode* lchild;
	BiNode* rchild;
	BiNode(int val):data(val),lchild(NULL),rchild(NULL){}
};
//二叉排序树的插入
//这里用引用的原因:我们要改变树里面指针的指向,比如要把新的Key插入到某个根节点右孩子
//那么就需要把右孩子指针指向新的节点,需要地址传递
void insertBST(BiNode* &root,int key)
{
	//如果为空树,就进行初始化
	//或者找到了合适的插入位置
	if (root == NULL)
	{
		 root = new BiNode(key);
	}
	else 
	{
		//如果不为空树,进行插入的时候需要比较大小
		//左小右大--左子树都小于根节点,右子树都大于根节点

		//递归三要素:结束条件 干什么 返回值 (只考虑当前层做什么,不展开考虑)
		//1.当发现当前遍历到的节点为空,结束递归
	    //2.通过比较大小,寻找合适的插入位置
		//3.无返回值
		if (key < root->data)
		{
			insertBST(root->lchild, key);
		}
		else 
		{
			insertBST(root->rchild, key);
		}
	}
}
//二叉树中序遍历得到二叉树的有序序列
void display(BiNode* root)
{
	//结束条件:当前节点为空
	if (!root)return;
	//干什么:中序遍历
	display(root->lchild);
	cout << root->data <<" ";
	display(root->rchild);
}
//二叉树的构建
void BiSortTree(int v[], int len)
{
	BiNode* root = NULL;
	for (int i = 0; i < len; i++)
	{
		insertBST(root, v[i]);
	}
	display(root);
}
//测试-------------------
void test()
{
	int v[10] = { 62,88,58,47,35,73,51,99,37,93 };
	BiSortTree(v, 10);
}
int main()
{
	test();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述

法2:用到了二叉排序树的查找

代码语言:javascript
复制
#include<iostream>
using namespace std;
struct BiNode {
	int data;
	BiNode* lchild;
	BiNode* rchild;
	BiNode(int val):data(val),lchild(NULL),rchild(NULL){}
	BiNode() {};
};
//递归中:T是当前节点   f是当前节点的双亲节点   
//如果没查到Key值,p记录的是最后一次访问的节点
//如果查到key值,p记录的是找到的节点
bool searchBST(BiNode* T, int key, BiNode* f, BiNode*& p)//这里p要用引用或二级指针,否则最后回溯返回的时候,返回的是初始值
//而我们要返回的是查找顶点的双亲节点
{
	//递归三要素:
	//1.结束条件:查到到空节点,查无此值   查到节点
	//2.递归内容:比较大小,进入左子树或者右子树进行查找
	//3.返回值:真或假
	if (!T)
	{
		p = f;
		return false;
	}
	if (T->data == key)
	{
		p = T;
		return true;
	}
	if (key < T->data)
	{
		return searchBST(T->lchild, key, T, p);
	}
	else 
	{
		return searchBST(T->rchild, key, T, p);
	}
}
//二叉排序树插入操作
bool insertBST(BiNode* &root,int key)//这里要对传入实参root值进行修改,要用引用
{
	BiNode *p=NULL, *s=NULL;
	if (!searchBST(root, key, NULL, p))//当前二叉树中没有此元素,就进行插入
	{
		s = new BiNode(key);
		if (p==NULL)//是空树
		{
			root = s;//插入s为新的根节点
		}
		else if(key<p->data)
		{
			p->lchild = s;//小的插入左子树
		}
		else
		{
			p->rchild = s;//大的插入右子树
		}
		return true;
	}
	else
	{
		return false;//当前二叉树中存在此元素,那么就不进行插入
	}
}
//二叉树中序遍历得到二叉树的有序序列
void display(BiNode* root)
{
	//结束条件:当前节点为空
	if (!root)return;
	//干什么:中序遍历
	display(root->lchild);
	cout << root->data <<" ";
	display(root->rchild);
}
//二叉树的构建
void BiSortTree(int v[], int len)
{
	BiNode *root = NULL;
	for (int i = 0; i < len; i++)
	{
		insertBST(root, v[i]);
	}
	display(root);
	cout << endl;
}
//测试-------------------
void test()
{
	int v[10] = { 62,88,58,47,35,73,51,99,37,93 };
	BiSortTree(v, 10);
}
int main()
{
	test();
	system("pause");
	return 0;
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二叉排序树概念
  • c++类的定义
  • 二叉排序树的插入
  • 二叉排序树的构造
  • 下面演示两种不同的方式实现二叉树的插入和构建
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档