查找二叉树的实现(查找,删除,插入)分别用递归和非递归
来源:互联网 发布:罗马2 兵种数据修改 编辑:程序博客网 时间:2024/05/15 05:55
对于一个查找二叉树的每个节点X,它的左子树中的节点的关键值都小于X的关键值,右子树中的所有节点的关键值都大于X的关键值。
并且所有的关键值都是相异的,不存在相同的。
二叉树的平均深度是O(log N),对于查找树找一个元素最多查找树的高度次。#include <iostream>using namespace std;template <class K, class V>struct BSTNode { BSTNode(const K& key, const V& value = V()) :_pLeft(NULL) ,_pRight(NULL) ,_key(key) ,_value(value) {} BSTNode *_pLeft; BSTNode *_pRight; K _key; V _value;};template <class K, class V>class BinarySearchTree { typedef BSTNode<K, V> Node; typedef BinarySearchTree<K, V> BSTree;public: BinarySearchTree() :_pRoot(NULL) {} BinarySearchTree(const BSTree& bst) { if (bst._pRoot) { _CopyBSTree(_pRoot, bst._pRoot); } } BSTree& operator = (const BSTree& bst) { if (this != &bst) { Node* temp; _CopyBSTree(temp, bst._pRoot); delete _pRoot; _pRoot = temp; } return (*this) ; } ~BinarySearchTree() { _Destroy(_pRoot); } bool Find(const K& key) { return _Find(_pRoot, key); } bool Find_Nor(const K& key) { return _Find_Nor(_pRoot, key); } bool Insert(const K& key, const V& value) { if (NULL == _pRoot) { _pRoot = new Node(key, value); return true; } if (Find(key)) { return false; //已有关键字为key的节点,不插入,返回false } //_Insert(_pRoot, key, value); _Insert_Nor(_pRoot, key, value); } bool Remove(const K& key) { if (NULL == _pRoot) return false; //空树返回false if (!Find(key)) return false; //树中没有key,返回false //_Remove_Nor(_pRoot, key); //非递归删除 _Remove(_pRoot, key); //递归删除 } void Inorder() { _InderOrder(_pRoot); cout << endl; }protected: void _CopyBSTree(Node* &proot, const Node* bstnode) { if (NULL == bstnode) return; proot = new Node(bstnode->_key, bstnode->_value); _CopyBSTree(proot->_pLeft, bstnode->_pLeft); _CopyBSTree(proot->_pRight, bstnode->_pRight); } void _Destroy(Node* &proot) { if (NULL == proot) return; _Destroy(proot->_pLeft); _Destroy(proot->_pRight); delete proot; }private: bool _Find(Node *proot, const K& key) //递归查找 { if (NULL == proot) return false; if (key == proot->_key) return true; else if (key > proot->_key) _Find(proot->_pRight, key); else _Find(proot->_pLeft, key); } bool _Find_Nor(Node *proot, const K& key) //非递归查找 { while (proot) { if (key == proot->_key) return true; else if (key > proot->_key) proot = proot->_pRight; else proot = proot->_pLeft; } return false; } bool _Insert(Node* &proot, const K& key, const V& value) //递归插入 { if (key > proot->_key) { if (NULL == proot->_pRight) { proot->_pRight = new Node(key, value); return true; //插入成功 } else _Insert(proot->_pRight, key, value); } if (key < proot->_key) { if (NULL == proot->_pLeft) { proot->_pLeft = new Node(key, value); return true; //插入成功 } else _Insert(proot->_pLeft, key, value); } } bool _Insert_Nor(Node* proot, const K& key, const V& value) //非递归插入 { while (proot) { if (key > proot->_key) { if (NULL == proot->_pRight) { proot->_pRight = new Node(key, value); return true; } else proot = proot->_pRight; } else if (key < proot->_key) { if (NULL == proot->_pLeft) { proot->_pLeft = new Node(key, value); return true; } else proot = proot->_pLeft; } } } bool _Remove_Nor(Node *&proot, const K& key) { //找到要删除的节点 Node *DelNode = proot; Node *ParentNode = NULL; while (true) { if (key == DelNode->_key) break; else if (key < DelNode->_key) { ParentNode = DelNode; DelNode = DelNode->_pLeft; } else { ParentNode = DelNode; DelNode = DelNode->_pRight; } } //被删除节点无孩子节点直接删除(可以归为下面两类) //被删除节点只有左孩子(用左孩子删除被代替节点) if (NULL == DelNode->_pRight) { if (NULL == ParentNode) proot = DelNode->_pLeft; else if ( DelNode == ParentNode->_pLeft) { ParentNode->_pLeft = DelNode->_pLeft; } else { ParentNode->_pRight = DelNode->_pLeft; } delete DelNode; return true; } //被删除节点只有右孩子(用右孩子代替被删除节点) else if (NULL == DelNode->_pLeft) { if (NULL == ParentNode) proot = DelNode->_pRight; else if (DelNode == ParentNode->_pLeft) { ParentNode->_pLeft = DelNode->_pRight; } else { ParentNode->_pRight = DelNode->_pRight; } delete DelNode; return true; } //被删除节点有左右孩子,将被删除节点右子树中的最小关键值给它,然后删除被交换的节点 //(该节点是被删除节点右子树中先序遍历的第一个节点) else { Node* firstNode = DelNode; ParentNode = DelNode; DelNode = DelNode->_pRight; while (DelNode->_pLeft) { ParentNode = DelNode; DelNode = DelNode->_pLeft; } std::swap(firstNode->_key , DelNode->_key); std::swap(firstNode->_value, DelNode->_value); if (DelNode->_pRight) { if (ParentNode->_pLeft == DelNode) ParentNode->_pLeft = DelNode->_pRight; else ParentNode->_pRight = DelNode->_pRight; } else ParentNode->_pLeft = NULL; delete DelNode; return true; } } bool _Remove(Node* &proot, const K& key) { if (key < proot->_key) { _Remove(proot->_pLeft, key); } else if (key > proot->_key) { _Remove(proot->_pRight, key); } else { if (proot->_pRight == NULL ) { Node* pDel = proot; proot = proot->_pLeft; delete pDel; return true; } else if (proot->_pLeft == NULL) { Node* pDel = proot; proot = proot->_pLeft; delete pDel; return true; } else { Node* pDel = proot; pDel = pDel->_pRight; while (pDel->_pLeft) { pDel = pDel->_pLeft; } proot->_key = pDel->_key; proot->_value = pDel->_value; _Remove(proot->_pRight, proot->_key); return true; } } } void _InderOrder(Node *proot) //中序遍历 { if (NULL == proot) return; _InderOrder(proot->_pLeft); cout << proot->_key << " "; _InderOrder(proot->_pRight); }private: Node *_pRoot;};int main(){ BinarySearchTree<int, int> tree; int arr[] = { 5,3,4,1,7,8,2,6,9,0 }; for (int i = 0; i < (sizeof(arr) / sizeof(arr[0])); ++i) { tree.Insert(arr[i],arr[i]); } tree.Inorder(); BinarySearchTree<int, int> tree2; tree2 = tree; tree2.Remove(5); tree2.Inorder(); system("pause"); return 0;}
阅读全文
1 0
- 查找二叉树的实现(查找,删除,插入)分别用递归和非递归
- 二叉搜索树的实现(查找,插入,删除的递归与非递归)
- 二叉搜索树的基本功能的实现(递归及非递归直线插入,删除,查找)
- 二叉搜索树(BST)递归与非递归的插入、删除、查找的实现
- 【c++】二叉搜索树的插入、查找、非递归删除
- 递归与非递归下二叉查找数的插入·查找和删除
- 分别用递归和非递归实现二分查找算法
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- 关于搜索二叉树的各种操作(插入,删除,输出,查找,递归非递归排序)
- 非递归实现二叉查找树插入操作
- 分别使用递归和非递归实现二分查找算法
- 二叉搜索树(递归和非递归分别实现)
- 二叉查找树的实现(插入+递归调用)
- 数据结构之二叉查找树的递归和非递归实现的一些方法
- 非递归实现二叉查找树
- 二叉查找树非递归实现
- Java(二分查找算法实现,分别使用递归和非递归方式)
- 统计输入中所有单词出现的次数(使用二叉查找树实现:递归和非递归)
- 测量程序执行时间·九
- 2017 西南交通大学ACM校赛简易题解
- pta试题训练
- jstl使用foreach 循环遍历输出表格和数据
- Python 高阶 Python函数式编程以及高阶函数reduce,sorted,filter
- 查找二叉树的实现(查找,删除,插入)分别用递归和非递归
- (一)spring boot 不继承parent搭建环境-入门
- centos 不执行/etc/rc.local 的问题
- kobject
- sicp(1) 正则序和应用序
- 时间复杂度和空间复杂度
- Xutils中网络请求
- StringBuilder,String与StringBuffer 的异同
- hibernate中的@GeneratedValue与@GenericGenerator