二叉查找树的基本操作之查找插入删除
2014-07-06 20:32
330 查看
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树:
1,若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
2,若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;
3,它的左、右子树也分别为二叉查找树。
类型定义:
查找:
a,若二叉查找树的根结点为NULL,直接使新节点成为根结点;
b,查找到有插入位置的结点(如果关键子已存在返回NULL并且退出);
c,若新结点的关键字小于插入点的关键字,使新节点称为插入点的左儿子结点,否则使之称为插入点的右儿子结点。
删除:
a,若删除的结点是叶子结点,直接删除结点。
b,若删除的结点只有左儿子或者右儿子,删除目标结点后用唯一的子结点代替原来的位置。
c,删除的结点有两个儿子结点时,首先用其左子树中的最大元素或者右子树中的最小元素代替该结点。然后将替代结点从其子树中删除。
测试结果:
插入 5 4 3
删除 5
REF:
1,http://blog.csdn.net/npy_lp/article/details/7426431
2,数据结构(C语言版)Ellis Horowitz , Sartaj Sahni , Susan Anderson-Freed
1,若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
2,若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;
3,它的左、右子树也分别为二叉查找树。
类型定义:
typedef struct BinTreeNode * BinTree; typedef struct BinTreeNode { int data; BinTree lchild,rchild; } BinTreeNode;
查找:
BinTree searchTree(BinTree T,int key) { while(T){ if (key == T->data) return T; if (key < T->data) T = T->lchild; else T = T->rchild; } return NULL; }插入:
a,若二叉查找树的根结点为NULL,直接使新节点成为根结点;
b,查找到有插入位置的结点(如果关键子已存在返回NULL并且退出);
c,若新结点的关键字小于插入点的关键字,使新节点称为插入点的左儿子结点,否则使之称为插入点的右儿子结点。
void insertBinTreeNode(BinTree *T,int data) { BinTree ptr = new BinTreeNode; ptr->data = data; ptr->lchild = ptr->rchild = NULL; if(*T == NULL) *T = ptr; else{ BinTree t,s; s = *T; while(s){ t = s; if (data == s->data){ delete ptr; return; } else if (data < s->data) s = s->lchild; else s = s->rchild; } if (data < t->data) t->lchild = ptr; else t->rchild = ptr; } }
删除:
a,若删除的结点是叶子结点,直接删除结点。
b,若删除的结点只有左儿子或者右儿子,删除目标结点后用唯一的子结点代替原来的位置。
c,删除的结点有两个儿子结点时,首先用其左子树中的最大元素或者右子树中的最小元素代替该结点。然后将替代结点从其子树中删除。
void deleteBinTreeNode(BinTree *T,int key) { BinTree s = *T,t,p; if (s == NULL) return; if (s->data == key){ /* leaf node */ if ( s->lchild == NULL && s->rchild == NULL) { *T = NULL; delete s; } /* lchild only */ else if (s->rchild == NULL) { *T = s->lchild; delete s; } /* rchild only */ else if (s->lchild == NULL) { *T = s->rchild; delete s; } /* both lchild and rchild */ else{ /* locate the min val in the right sub tree */ t = s->rchild; if(t->lchild == NULL){ s->rchild = t->rchild; /* copy data of t into s :(*T) */ s->data = t->data; delete t; } else{ while (t->lchild){ /* p : parent of t */ p = t; t = t->lchild; } s->data = t->data; p->lchild = t->rchild; delete t; } //if(t->lchild == NULL) // t->lchild = s->lchild; //else{ // while(t->lchild){ // /* p : parent */ // p = t; // t = t->lchild; // } // // p->lchild = t->rchild; // t->lchild = s->lchild; // t->rchild = s->rchild; //} //*T = t; //delete s; } } else if (key < s->data) { deleteBinTreeNode(&(s->lchild),key); } else if (key > s->data) { deleteBinTreeNode(&(s->rchild),key); } }
测试结果:
插入 5 4 3
5 / 4 / 3插入 7 6
5 / \ 4 7 / / 3 6删除 8 7
5 / \ 4 6 / 3插入 9 8
5 / \ 4 6 / \ 3 9 / 8删除 6 插入10
5 / \ 4 9 / / \ 3 8 10删除 9 插入7
5 / \ 4 10 / / 3 8 / 7
删除 5
7 / \ 4 10 / / 3 8
REF:
1,http://blog.csdn.net/npy_lp/article/details/7426431
2,数据结构(C语言版)Ellis Horowitz , Sartaj Sahni , Susan Anderson-Freed
相关文章推荐
- 二叉查找树的查找、插入、删除、释放等基本操作的实现(C语言)
- 二叉搜索树的基本操作(查找、插入、删除)【数据结构】
- C语言实现顺序表的插入、删除、查找、遍历等基本操作
- 线性表的基本操作(插入,删除,查找)
- 二叉查找树的操作(插入、删除、查找)
- 二叉查找树的各种操作(插入、删除、查找、遍历)
- 数据结构基础5.2:二叉搜索树(BST)的基本操作(插入、查找、删除)
- 用C语言编写一个包含链表的初始化、插入、删除、查找等基本操作的程序。
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- Linked List的基本操作(创建/删除/插入/查找)
- 单链表的基本操作(尾插,尾删,头插,头删,查找,指定位置插入、删除,指定元素删除、全部删除等)
- 链表的基本操作(C语言版):建立,插入,删除,查找,输出
- 单链表的基本操作(查找,插入,删除)
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 编程实现顺序存储结构和链式存储结构线性表的建立、查找、插入、删除等基本操作
- 链表(单双链表)用法与基本操作(构建、查找、插入、删除)实现
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- 链表基本操作(删除,插入,查找)
- 二叉排序树的基本操作(建立,中序遍历,查找,删除,插入)
- 线性表的链式存储格式基本操作:创建链表、插入、删除、查找、求表长、打印链表