二叉查找树(Binary Search Tree) 1 minute read 二叉查找树是指具有如下性质的二叉树: 左子树上的所有节点的值都小于根节点; 右子树上的所有节点的值都大于根节点; 左右子树均为二叉搜索树。 Binary Search Tree (Source: https://visualgo.net) C#代码 //树节点的定义 public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; } } //查找算法 bool SearchBST(TreeNode node, int target) { if (node == null) { // 查找不成功 return false; } else if (target == node.val) { // 查找成功 return true; } else if (target < node.val) { // 在左子樹中繼續查找 return SearchBST(node.left, target); } else { // 在右子樹中繼續查找 return SearchBST(node.right, target); } } //插入算法 TreeNode InsertBST(TreeNode node, int target) { if (node == null) { return new TreeNode(target); } if (node.val > target){ node = InsertBST(node.left, target); // 將 e 插入左子樹 } else { node = InsertBST(node.right, target); // 將 e 插入右子樹 } return node; } Status DeleteBST(BiTree *T, KeyType key) { // 若二叉查找树T中存在关键字等于key的数据元素时,则删除该数据元素,并返回 // TRUE;否则返回FALSE if (!T) return false; //不存在关键字等于key的数据元素 else { if (key == T->data.key) // 找到关键字等于key的数据元素 return Delete(T); else if (key < T->data.key) return DeleteBST(T->lchild, key); else return DeleteBST(T->rchild, key); } } Status Delete(BiTree *&p) { // 该节点为叶子节点,直接删除 BiTree *q, *s; if (!p->rchild && !p->lchild) { delete p; p = NULL; // Status Delete(BiTree *&p) 要加&才能使P指向NULL } else if (!p->rchild) { // 右子树空则只需重接它的左子树 q = p->lchild; /* p->data = p->lchild->data; p->lchild=p->lchild->lchild; p->rchild=p->lchild->rchild; */ p->data = q->data; p->lchild = q->lchild; p->rchild = q->rchild; delete q; } else if (!p->lchild) { // 左子树空只需重接它的右子树 q = p->rchild; /* p->data = p->rchild->data; p->lchild=p->rchild->lchild; p->rchild=p->rchild->rchild; */ p->data = q->data; p->lchild = q->lchild; p->rchild = q->rchild; delete q; } else { // 左右子树均不空 q = p; s = p->lchild; while (s->rchild) { q = s; s = s->rchild; } // 转左,然后向右到尽头 p->data = s->data; // s指向被删结点的“前驱” if (q != p) q->rchild = s->lchild; // 重接*q的右子树 else q->lchild = s->lchild; // 重接*q的左子树 delete s; } return true; } // 时间与空间复杂度 二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低,均为O(logN)。 其它特性 相关问题 回到数据结构页 Twitter Facebook LinkedIn Previous Next
二分查找(Binary Search) less than 1 minute read 二分搜索是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索...
快速排序(Quick Sort) less than 1 minute read 快速排序是现今为止不管是理论上还是实际上都是最高效的一种通用排序方法。它使用分治法(Divide and conquer)策略来把一个序列分为较小和较大的2个子序列,然后递归地排序两个子序列。
归并排序(Merge Sort) less than 1 minute read 归并排序是建立在分治法(divide and conquer)思想上的一种排序方法。基本的原理是把要排序的序列先分成两半,然后对各半个序列分别进行归并排序,然后再将排好序的半个序列用归并操作合成一个有序的完整序列。
希尔排序(Shell Sort) less than 1 minute read 希尔排序是插入排序的一个改进版本。希尔排序的改进基础在于插入排序具有对接近正序(partially sorted)的序列能高效进行排序的特性,通过对精心选择的部分元素进行排序,让整个序列趋近于正序,最终完成排序。