二叉排序树

60 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

二叉排序树(BST)

  • 二叉排序树(Binary Search Tree)是一种动态树表。 二叉排序树的定义:二叉排序树或者是一棵空树, 或者是一棵具有如下性质的二叉树: ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ⑶ 左、右子树本身又各是一棵二叉排序树。

  • 性质

    1. 左子树结点值 < 根结点值 < 右子树结点值
    2. 对二叉排序树进行中序遍历,得到递增的有序序列

查找

  1. 非递归算法 时间复杂度:O(1)
BSTNode *BST_Search(BiTree T, ElemType key) {
	while(T != NULL && key != T -> data) {
		if(key < T -> data) T = T -> lchild;
		else T = T -> rchild;
	}
	return T;
}
  1. 递归算法 时间复杂度:O(h)
BSTNode *BST_Search(BiTree T, ElemType key) { // 树结构、关键字
	if(T == NULL) return NULL;
	if(key < T -> data) 
		return BST_Search(T -> lchild, key);
	else if(key > T -> data) 
		return BST_Search(T -> rchild, key);
	else 
		return T;
}

插入

int BST_Insert(BiTree &T, ElemType k) { // 树引用、关键字
	if(T == NULL) {
		T = (BiTree)malloc(sizeof(BSTNode)); // BSTNode指该结点(包含指针和数据)
		T -> data = k; // 填充数据
		T -> lchild = NULL; T -> rchild = NULL; // 左右子树为NULL
		return 1;
	} else if(k == T -> data) { // 存在相同数据,插入失败
		return 0;
	} else if(k < T -> data) {	// 插入左子树
		return BST_Insert(T -> lchild, k);
	} else { // 插入右子树
		return BST_Insert(T -> rchild, k);
	}
}

构造

  1. 手动构造 根据性质:左子树结点值 < 根结点值 < 右子树结点值 在这里插入图片描述

  2. 代码实现

void Creat_BST(BiTree &T, ElemType str[], int n) { // 树引用、关键字数组、长度
	T = NULL; // 初始为空
	int i = 0;
	while(i < n) { // 依次插入关键字
		BST_Insert(T, str[i]);
	}
}

删除

  1. 删除叶结点,直接删除
  2. 删除的结点x只有左子树/右子树,让x的子树成为x的父节点的子树
  3. 删除的结点x既有左子树,又有右子树,让x的直接前驱代替x,转化为(1)或(2)

在这里插入图片描述