数据结构笔记——二叉搜索树的基本方法

二叉搜索树是一种独特的结构,其遍历是按顺序输出元素,基本建立过程是:插入一个值,判断与根结点的元素大小,小于根就进左子树,大于根就进右子树。
实现过程如下:

typedef struct node {	//树的结点
	int data;
	struct node* left;
	struct node* right;
}*N, treeNode;

typedef struct {	// 树的根
	treeNode * root;
}Tree;
void insertnode(Tree *tree, int value) {  // 注意函数的参数  传进来一个指向树的指针
	N newnode;
	newnode = (N)malloc(sizeof(treeNode));		//创建新结点
	newnode->data = value;
	newnode->left = NULL;
	newnode->right = NULL;

	if (tree->root == NULL) {			//	如果树为空,则让新结点作为根
		tree->root = newnode;
	}
	else {								//	当进行上面的操作后 ,树肯定不为空了
		N temp = tree->root;			//	然后新建结点temp,让其从根部开始往下搜索,
		while (temp != NULL) {			
			if (value < temp->data) {	//	如果value < temp->data(也就是上面创建的那个根的值)
				if (temp->left == NULL) {	// 小于的话那肯定往左边走,如果temp的左子树为空,直接插入newnode为左子树就完事
					temp->left = newnode;
					return;
				}
				else {					// 这里temp的左子树不为空,那就往下呗 ,为空就直接插入newnode
					temp = temp->left;
				}
			}
			else {
				if (value > temp->data) {	// 这是value 大于 temp->data 的情况  ,跟上面一样,很好理解的啦
					if (temp->right == NULL) {
						temp->right = newnode;
						return;
					}
					else {
						temp = temp->right;
					}
				}
			}
		}
	}
	return;
}

还有就是搜索操作:

N findnode2(int x, N BST)
{
	if (BST == NULL) {
		return NULL;
	}
	while (BST) {
		if (x > BST->data) {
			BST = BST->right;
		}
		else if (x < BST->data) {
			BST = BST->left;
		}
		else {
			return BST;
		}
	}
}

插入操作:

N Insertnode(int x , N T)
{
	if (!T) {	// 空树
		T = (N)malloc(sizeof(treeNode));
		T->data = x;
		T->left = NULL;
		T->right = NULL;
	}else {
		if (x > T->data) {
			T->right = Insertnode(x, T->right);
		}
		else if (x < T->data)
		{
			T->left = Insertnode(x, T->left);
		}
	}
	return T;
}

找最大值:往右子树找到底就是最大的,最小值往左子树找到底
具体实现(找最大值为例):

N findmax(N MAX) {
	if (MAX) {
		while (MAX->right) {
			MAX = MAX->right;
		}
		return MAX;
	}
}

中序遍历:

void printtree(N nodee) {
	if (nodee != NULL) {
		printtree(nodee->left);
		cout << nodee->data<<"  ";
		printtree(nodee->right);
	}
}

主函数:

int main()
{
	Tree tree;	// 创建一棵树
	tree.root = NULL;	// 树根指向空
	int n;		
	cin >> n;	// 输入n , 意思是有多少个结点
	for (int i = 1; i <= n; i++) {
		int temp;		
		cin >> temp;	// 输入temp 为结点的值
		insertnode(&tree, temp); // 注意这里的实参,传进去树的地址(也可以说指向树的指针)
	}
	int x;		//	输入x 进行插入操作
	cin >> x;
	tree.root = Insertnode(x, tree.root);	// 插入函数
	printtree(tree.root);		// 遍历函数 (这里采用中序遍历)
	cout << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kcoren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值