二叉树C++ Version
来源:互联网 发布:大螺距螺纹编程实例 编辑:程序博客网 时间:2024/05/21 06:51
#include <iostream.h>#include <cstring>typedef int KeyType;#define NUM 11class BinStree;class BinSTreeNode{public: KeyType key; BinSTreeNode *lchild; BinSTreeNode *rchild; BinSTreeNode() { lchild = NULL; rchild = NULL; }};class BinSTree{public: BinSTreeNode *root; BinSTree() { root = NULL; } ~BinSTree() { //delete root; } BinSTreeNode *BSTreeSearch( BinSTreeNode *bt, KeyType k, BinSTreeNode *&p ); void BSTreeInsert( BinSTreeNode *&bt, KeyType k ); int BSTreeDelete( BinSTreeNode *&bt, KeyType k ); void BSTreePreOrder(BinSTreeNode *bt); bool IsEmpty() { return root == NULL; }};/** * 二叉树排序查找算法 * 在根指针为bt的二叉排序树中查找元素k的节点,若查找成功,则返回指向该节点的指针 * 参数p指向查找到的结点,否则返回空指针,参数p指向k应插入的父结点 */BinSTreeNode* BinSTree::BSTreeSearch( BinSTreeNode *bt, KeyType k, BinSTreeNode *&p ){ BinSTreeNode *q = NULL; q = bt; while(q) { p = q; if( q->key == k ) { return(p); } if( q->key > k ) q = q->lchild; else q = q->rchild; } return NULL;}/** * 二叉排序树的插入节点算法 * bt指向二叉排序树的根结点,插入元素k的结点 */void BinSTree::BSTreeInsert( BinSTreeNode *&bt, KeyType k ){ BinSTreeNode *p = NULL, *q; q = bt; if( BSTreeSearch( q, k, p ) == NULL ) { BinSTreeNode *r = new BinSTreeNode; r->key = k; r->lchild = r->rchild = NULL; if( q == NULL )//这里的q代表的bt,不是search函数里面的q { bt = r; //被插入节点做为树的根节点 } if( p && k < p->key ) p->lchild = r; else if( p ) p->rchild = r; }}/** * 中序遍历 */ void BinSTree::BSTreePreOrder(BinSTreeNode *bt){ if(bt != NULL) { cout << bt->key << " "; BSTreePreOrder(bt->lchild); BSTreePreOrder(bt->rchild); }}/** * 二叉排序树的删除结点算法 * 在二叉排序树中删除元素为k的结点,*bt指向二叉排序树的根节点 * 删除成功返回1,不成功返回0. */int BinSTree::BSTreeDelete( BinSTreeNode *&bt, KeyType k ){ BinSTreeNode *f, *p, *q, *s; p = bt; f = NULL; //查找关键字为k的结点,同时将此结点的双亲找出来 while( p && p->key != k ) { f = p; if( p->key > k ) p = p->lchild; else p = p->rchild; } if( p == NULL ) //找不到待删除的结点时返回 return 0; if( p->lchild == NULL ) //待删除结点的左子树为空 { if( f == NULL ) //待删除结点为根节点 bt = p->rchild; else if( f->lchild == p ) //待删结点是其双亲结点的左节点 f->lchild = p->rchild; else f->rchild = p->rchild; //待删结点是其双亲结点的右节点 delete p; } else //待删除结点有左子树 { q = p; s = p->lchild; while( s->rchild ) //在待删除结点的左子树中查找最右下结点 { q = s; s = s->rchild; } if( q == p ) q->lchild = s->lchild; else q->rchild = s->lchild; p->key = s->key; delete s; } return 1;}int main( void ){ int a[NUM] = { 34, 18, 76, 13, 52, 82, 16, 67, 58, 73, 72 }; int i; BinSTree bst; BinSTreeNode *pBt = NULL, *p = NULL, *pT = NULL; for( i = 0; i < NUM; i++ ) { bst.BSTreeInsert( pBt, a[i] ); //创建二叉排序树 } pT = bst.BSTreeSearch( pBt, 52, p ); //搜索排序二叉树 bst.BSTreePreOrder(pBt); cout << endl; bst.BSTreeDelete( pBt, 13 ); //删除无左孩子的情况 bst.BSTreePreOrder(pBt); cout << endl; bst.BSTreeDelete( pBt, 76 ); //删除有左孩子的情况 bst.BSTreePreOrder(pBt); cout << endl; return 0;}
注意:? *& bt 和 *bt 和&bt的不同。
- 二叉树C++ Version
- C语言版--二叉树
- btree-C二叉树
- 数据结构(C++)--二叉树
- C二叉树
- C语言版--二叉树
- 二叉查找树(C#)
- C语言 二叉树
- c的二叉树
- 二叉树 c实现
- 二叉树(数据结构 c++)
- c语言 二叉树
- 二叉树(C++)
- [c]二叉树
- 【数据结构】二叉树(c++)
- 二叉树(C语言)
- 二叉搜索树(c++)
- [C++]二叉树总结
- Linux环境进程间通信(一)
- Hibernate注解,生成主键策略
- CArchive 原理
- 自定义动画之一列中某一图片在表格中依次移动到不同列
- Android教程(十二)-- 使用DisplayMetrics获取手机分辨率
- 二叉树C++ Version
- linux没有 eth0
- [4月30日的脚本] 在Windows 8中使用脚本安装.NET Framework 3.5 (PowerShell)
- 利用jQuery实现全选、反选、删除和添加
- 单层需继承的内存图(VC6.0)
- SPRING.NET 1.3.2 学习26--容器扩展点
- 算法题目一:全排列(C++实现)
- [Django1.5]'url' requires a non-empty first argument. 错误
- 野指针