搜索二叉树的基本操作
来源:互联网 发布:数据质量监控系统 编辑:程序博客网 时间:2024/06/14 04:35
搜索二叉树的非递归基本操作
为什么要找右孩子的最左节点因为右孩子的最左节点一定比要删除的节点的右孩子上的任意一个节点都要小替换删除之后搜索为茶树还是搜索二叉树#include<iostream>#include<stdlib.h>using namespace std;template<class K>struct BinarySearchTreeNode{ BinarySearchTreeNode<K > *_left; BinarySearchTreeNode<K > *_right; K _key; BinarySearchTreeNode( const K &x) :_left( NULL) , _right( NULL) , _key( x) { }};template<class K>class BinarySearchTree{ typedef BinarySearchTreeNode <K> Node;public: BinarySearchTree() :_root( NULL) { } bool BinarySearchInsert( const K & key) { if (_root == NULL ) { _root = new Node (key); return true ; } else { Node *cur = _root; Node *parent = NULL ; while (cur) { if (cur->_key > key ) { parent = cur; cur = cur->_left; } else if (cur->_key < key) { parent = cur; cur = cur->_right; } else { return false ; } } if (key >parent->_key) { parent->_right = new Node (key); return true ; } else if (key < parent->_key) { parent->_left = new Node (key); return true ; } } } const Node * Find(const K&key ) { if (_root == NULL ) { return NULL ; } else { Node*cur = _root; while (cur) { if (cur->_key > key ) { cur = cur->_left; } else if (cur->_key < key) { cur = cur->_right; } else { return cur; } } return NULL ; } } bool Remove(const K& key) { if (_root == NULL ) { return false ; } else { Node*del = NULL ; Node*cur = _root; Node*parent = NULL ; while (cur) { if (cur->_key > key ) { parent = cur; cur = cur->_left; } else if (cur->_key < key) { parent = cur; cur = cur->_right; } else { if (cur->_left == NULL ) { if (parent->_left == cur) { del = cur; parent->_left = cur->_right; } else { del = cur; parent->_right = cur->_right; } } else if (cur->_right == NULL) { if (parent->_left == cur) { del = cur; parent->_left = cur->_left; } else { del = cur; parent->_right = cur->_left; } } else//要删除的节点左右都不为空,使用替换法 { Node *parent = cur; Node*subRight = cur->_right;//选择找右孩子的最左节点 while (subRight->_left) { parent = subRight; subRight = subRight->_left; } cur->_key = subRight->_key; if (parent->_left == subRight) { del = cur; parent->_left = subRight->_left; } else { del = cur; parent->_right = subRight->_left; } } } delete del; del = NULL; return true ; } return false ; } } void InOrder() { _InOrder(_root); }protected: void _InOrder(Node *root) { if (root == NULL) { return; } _InOrder( root->_left); cout << root->_key << " " ; _InOrder( root->_right); } Node*_root;};int main(){ BinarySearchTree<int >bs; bs.BinarySearchInsert(5); bs.BinarySearchInsert(3); bs.BinarySearchInsert(4); bs.BinarySearchInsert(1); bs.BinarySearchInsert(7); bs.BinarySearchInsert(8); bs.BinarySearchInsert(2); bs.BinarySearchInsert(6); bs.BinarySearchInsert(0); bs.BinarySearchInsert(9); bs.InOrder(); cout << endl; bs.Remove(5); bs.Remove(3); bs.Remove(4); bs.Remove(1); bs.InOrder(); system( "pause"); return 0;}
搜索二叉树递归的基本操作
搜索二叉树递归的基本操作#include <iostream>#include <stdlib.h>using namespace std;template <class K>struct BinarySearchTreeNode{ BinarySearchTreeNode <K > *_left; BinarySearchTreeNode <K > *_right; K _key; BinarySearchTreeNode( const K & x) :_left( NULL ) , _right( NULL ) , _key( x ) { }};template <class T>class BinarySearchTree{ typedef BinarySearchTreeNode < T> Node ;public : BinarySearchTree() :_root( NULL ) { } bool BinarySearchInsertR(const T& key ) { return _InsertR(_root, key ); } Node *Find(const T& key ) { return _Find(_root, key ); } bool Remove(const T& key ) { return _Remove(_root, key ); } void InOrder() { _InOrder(_root); cout << endl; }protected : void _InOrder(Node * root) { if (root == NULL) { return ; } _InOrder( root ->_left); cout << root ->_key << " " ; _InOrder( root ->_right); } bool _InsertR(Node *& root, const T & key) { if (root == NULL) { root = new Node( key ); return true ; } if (root ->_key > key) { return _InsertR(root ->_left, key); } else if ( root->_key < key ) { return _InsertR(root ->_right, key); } else { return false ; } } Node * _Find(Node * root, const T & key) { if (root == NULL) { return NULL ; } if (root ->_key < key) { return _Find(root ->_right, key); } else if ( root->_key> key ) { return _Find(root ->_left, key); } else { return root ; } } bool _Remove(Node *& root, const T & key) { if (root == NULL) { return false ; } if (root ->_key < key) { return _Remove(root ->_right, key); } else if ( root->_key> key ) { return _Remove(root ->_left, key); } else //找到了可以删除 { Node *del = NULL ; if (root ->_left == NULL) { del = root ; root = root ->_right; return true ; } else if ( root->_right == NULL ) { del = root ; root = root ->_left; } else //左右子树都不为空,找到右子树的最左节点 { Node *left = root ->_right; while (left->_left) { left = left->_left; } root ->_key = left->_key; _Remove( root ->_right, left->_key); return true ; } } } Node *_root;};int main(){ BinarySearchTree <int >bs; bs.BinarySearchInsertR(5); bs.BinarySearchInsertR(3); bs.BinarySearchInsertR(4); bs.BinarySearchInsertR(1); bs.BinarySearchInsertR(7); bs.BinarySearchInsertR(8); bs.BinarySearchInsertR(2); bs.BinarySearchInsertR(6); bs.BinarySearchInsertR(0); bs.BinarySearchInsertR(9); bs.Remove(5); bs.Remove(3); bs.Remove(4); bs.Remove(1); bs.Remove(7); bs.Remove(8); bs.Remove(2); bs.Remove(6); bs.Remove(0); bs.Remove(9); bs.InOrder(); cout << bs.Find(2); system( "pause" ); return 0;}
阅读全文
1 0
- 【二叉搜索树】二叉搜索树的基本操作
- 二叉搜索树(BST)的基本操作
- 二叉搜索树的一些基本操作
- 二叉搜索树的基本操作
- c++搜索二叉树的基本操作
- 二叉搜索树的一些基本操作
- 二叉搜索树的基本操作
- 搜索二叉树的基本操作
- 二叉搜索树的基本操作
- 二叉搜索树(BST)的基本操作
- 二叉搜索树的基本操作
- 二叉搜索树基本操作
- 二叉搜索树基本操作
- 二叉搜索树的基本操作(C代码实现)
- 二叉搜索树的基本操作(含代码)
- 数据结构:二叉搜索树(BST)的基本操作
- 二叉搜索树的查找与删除一些基本操作
- 【数据结构基础】二叉搜索(排序)树的基本操作
- 基于深度学习的自然场景文字识别
- (120)创建时间轴
- 初窥Spring之依赖注入
- 监听器如何获取Spring配置文件
- Rails Activeadmin 界面构成方法解析
- 搜索二叉树的基本操作
- 通过loosejar 清理程序无用jar包
- PI清除IDOC缓存
- Android 杂知识总结
- 画出网络结构
- 提高编码技能的10个窍门
- 如何高效利用GitHub
- VS2008工程中 附加依赖项 和 附加库目录
- curl请求