自己实现的 二叉查找树,受益于人,回馈于人
#include <stdio.h>
#include <stdlib.h>
typedef struct node* pNode;
struct node {
int data;
pNode left;
pNode right;
pNode parent;
};
pNode root;
void traverse(pNode);
pNode search(pNode, int);
pNode getMin(pNode);
pNode getMax(pNode);
pNode getSuccessor(pNode, int);
void insert(pNode* root, pNode element); //////// insert new element
pNode delete(pNode* root, int);
#include "BSTree.h"
/*************************
* Binary search tree
*
* By Jia Pengcheng
*************************/
void traverse(pNode root){
pNode st = root;
if(st){
traverse(st->left);
printf("%d, ", st->data);
traverse(st->right);
}
}
void insert(pNode* root, pNode element){
//<1> first, need to know whether this element has been in the tree
pNode start = *root;
// if the tree is empty
if(!start){
*root = element;
return;
}
pNode backup_start = NULL;
while(start){
backup_start = start; // save the position for insertion
if(element->data > start->data){
start = start->right;
}else if(element->data <= start->data){
start = start->left;
}
}
// if not existed
element->parent = backup_start;
if(element->data > backup_start->data){
backup_start->right = element;
}else{
backup_start->left = element;
}
}
pNode search(pNode root, int val){
pNode st = root;
while(st && (st->data != val)){
if(st->data > val){
st = st->left;
}else if(st->data < val){
st = st->right;
}
}
return st;
}
pNode getMax(pNode root){
pNode st = root;
while(st->right){
st = st->right;
}
return st;
}
pNode getMin(pNode root){
pNode st = root;
while(st->left){
st = st->left;
}
return st;
}
pNode getSuccessor(pNode root, int val){
pNode elem = NULL;
if(!(elem = search(root, val))) return NULL;
// if elem has right child, successor is the minimum element
if(elem->right){
return getMin(elem->right);
}else{ //////////// if has no right child, find the node which is its parent's left child, ruturn the parent
pNode tmp = elem->parent;
while(tmp && elem == tmp->right){
elem = tmp;
tmp = tmp->parent;
}
return tmp;
//pNode tmp = NULL;
//do{
//tmp = elem;
//elem = elem->parent;
//}while(elem && (tmp == elem->right));
//return tmp;
}
}
/// one child, two childs, 0 child
pNode delete(pNode* root, int val){
/// empty tree
if(!*root) return;
// this elem is not in the tree
pNode elem = search(*root, val);
if(!elem){
printf("%d is not in the tree\n", val);
return NULL;
}
pNode tmp = NULL;
if(!elem->left || !elem->right){
tmp = elem; /// if elem has one child or zero child
}else{
tmp = getSuccessor(*root,val); /// id elem has two childs, delete successor of elem, and then replace elem with successor
/// we need to know that successor of elem has one right child at most, it does not have left child
///printf("Successor is %d\n", tmp->data);
}
///========================= has at most one child ============================
pNode child = NULL;
if(tmp->left) /// why left first? cos successor of elem has no left child
child = tmp->left;
else
child = tmp->right;
if(child)
child->parent = tmp->parent; /// set parent pointer of elem's child, when tmp has one child
/// if tmp has parent, it means that it is not the root node
if(tmp->parent){
if(tmp == tmp->parent->left){
tmp->parent->left = child;
}else{
tmp->parent->right = child;
}
}else{
*root = child; /// tmp has no parent, it is root, when tmp is deleted, child should become the root
}
/// ===========================================================
///if tmp has two childs, tmp is the successor of tmp, so tmp != elem
if(tmp != elem){
elem->data = tmp->data; /// replace date of elem with data of tmp which is the successor of elem
}
return tmp;
}
分享到:
相关推荐
二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...
二叉查找树(Binary Search Tree, BST)是一种基础但非常重要的数据结构,它在计算机科学中扮演着核心角色,尤其是在算法和数据结构的学习中。二叉查找树的主要特性是每个节点的左子树只包含小于该节点的元素,右子...
二叉查找树(Binary Search Tree, BST)是一种特殊的数据结构,它在计算机科学中用于高效地存储和检索数据。在二叉查找树中,每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用以及一个指向右子节点...
二叉查找树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,每个节点的键都大于其左子树中的...
二叉查找树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的所有...
在C++编程中,二叉查找树(Binary Search Tree,简称BST)是一种常见的数据结构,它具有以下特性:对于任意节点,其左子树中的所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。这种性质使得...
- **二叉查找树**(Binary Search Tree,简称BST)是一种数据结构,其中每个节点最多有两个子节点,并且满足以下性质:对于任意节点,其左子树中的所有节点的值小于该节点的值,其右子树中的所有节点的值大于该节点...
首先,我们要理解二叉查找树(Binary Search Tree, BST)的基本概念。二叉查找树是一种二叉树,其中每个节点都包含一个键、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都包含一个键值(key)、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的所有节点的键值都...
二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值、一个指向左子树的指针和一个指向右子树的指针。在二叉查找树中,对于任意节点,其左子树中的...
二叉查找树(Binary Search Tree,BST),也称为二叉排序树,是一种特殊的二叉树数据结构。它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉查找树中,对于...
二叉查找树(Binary Search Tree,BST)是一种特殊的数据结构,属于树形数据结构的一种,它具有以下特性:每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。在二叉查找树...
本文将详细介绍如何使用C++来实现一个二叉查找树(Binary Search Tree, BST),包括其基本操作:插入、删除、遍历等,并通过示例代码进行解释。二叉查找树是一种非常重要的数据结构,在计算机科学领域有着广泛的应用,...
### BST二叉排序树知识点详解 #### 一、BST(二叉排序树)定义与性质 **定义**: - **二叉检索树**(Binary Search Tree, BST)是一种特殊的二叉树,它满足以下条件: - 该树可以为空树。 - 若非空,则每个节点...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上的所有节点的值都大于该节点的值。这个特性使得在...
在计算机科学领域,二叉查找树(Binary Search Tree, BST)是一种非常重要的数据结构,它能够有效地实现查找、插入和删除等基本操作。然而,在某些情况下,普通的二叉查找树可能会退化成链式结构,导致性能下降。为了...
二叉查找树(Binary Search Tree, BST)是另一种用于快速查找和插入的数据结构。二叉查找树的每个节点都包含一个键值和左、右两个子树。在二叉查找树中,左子树上的所有节点的键值都小于其根节点的键值,而右子树上...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上的所有节点的值都大于该节点的值。这样的特性使得...