二叉树实现各种容器.docxVIP

  • 1
  • 0
  • 约5.3千字
  • 约 10页
  • 2021-03-11 发布于山东
  • 举报
排序二叉 树总结 : 查找 查找是其他操作的前提,因 为插入和 删除的时候都用到了 查找 查找的 时候树可以抽象成一个三角形,运用 递归 的方法很容易就能 实现 插入 做的 过程中 发现 一句 话很精髓:排序二叉 树插入的 节点肯定是叶 节点。 明白上面的道理了 实现 起来就很容易了。 删除 实现 的方法是,先整理右子 树,把右子 树中最小的元素作 为右子 树的根节点,然后用 这个根 节点代替 删除的 节点。 按照 这种 思路,那么左子 树中最大的元素替 换应该 也能 实现 同样的功能,没有 编码实现 ,只实现了上面那 种方法。 删除是操作里面最麻 烦的了,想着就 头疼,因 为要保持 树的性质。 测试过 程中如果 顺序插入元素那 么生成的 树就是一个 线性表,使用效率肯定不高,下个平衡树。  步实现 代码贴出来: #ifndef __BST_H__ #define __BST_H__ templatetypename K, typename T class SpiderMap { private: struct Node { K key; value; //父节点 Node* pP; 左孩子 Node* pL; 右孩子 Node* pR; Node() : key(-1), pP(NULL), pL(NULL), pR(NULL) { } }; public: typedef Node* iterator; public: SpiderMap(); ~SpiderMap(); 查找接口 const iterator find(K k); 插入接口 void insert(K k, T t); 删除接口 void delNode(K k); private: 具体的 查找实现 Node* _find(Node* mRoot, K key); 将要 删除节点的右子 树进 行整理 Node* _trim(Node* mRoot); private: Node* mRoot; }; templatetypename K, typename T SpiderMapK, T::SpiderMap() : mRoot(0) { } templatetypename K, typename T SpiderMapK, T::~SpiderMap() { } /** 查找接口 找到了返回当前 节点指针 找不到返回空迭代器 */ templatetypename K, typename T const typename SpiderMapK, T::iterator SpiderMapK, T::find(K k) { Node* node = new Node(); node-key = k; iterator iter = _find(mRoot, node-key); if (iter-key == k) { return iter; } delete node; return NULL; } /** 插入接口 把传入的 键值对 插入到当前的 树中 */ templatetypename K, typename T void SpiderMapK, T::insert(K k, T t) { 创造一个 节点 iterator node = new Node(); node-key = k; node-value = t; 首先判断当前的 树是否 为空树 if (mRoot == NULL) { mRoot = node; } else { //如果不是空 树就查找应该 插入的父 节点位置 iterator iter = _find(mRoot, node-key); if (iter-key != node-key) { 判断 应该插到左子 树还 是右子 树 (iter-key node-key) ? (iter-pL = node) : (iter-pR = node); 给节点的父节点赋值 node-pP = iter; } } } /** 删除节点 总体思路, 删除的 节点是以下 类型: * 1) 叶子 * 2) 只有左子 树 * 3) 只有右子 树 * 4) 有左右子 树 */ templatetypename K, typename T void SpiderMapK, T::delNode(K key) { 将要删除的元素 iterator current; current = _find(mRoot, key); if (current-key != key) { //树中没有指定 删除的元素 return; } 删除的元素是叶子 节点 if (NULL == current-pL NULL == curre

文档评论(0)

1亿VIP精品文档

相关文档