二叉搜索树
来源:互联网 发布:java工程师工作经历 编辑:程序博客网 时间:2024/06/06 09:14
概念介绍
http://www.cnblogs.com/QG-whz/p/4536875.html?utm_source=tuicool&utm_medium=referral(包含C++具体实现,待研究)
简单实现和测试
#pragma once#include<iostream>using namespace std;struct Node{ int data; Node*Lchild, *Rchild;};class BSTree{private: Node*root;public: BSTree() { root = NULL; } ~BSTree() { delete root; } bool FindBSTree(Node *r, int &elem); void InsertBSTree(Node *&r, const int elem); bool DeleteBSTree(Node *&r, const int &elem); void ConstructBSTree(int w[],int n); void inorder(Node *r); void inorder();};void BSTree::ConstructBSTree(int w[],int n){ for (int i = 0; i < n; i++) InsertBSTree(root, w[i]);}void BSTree::inorder(Node *r){ if (r != NULL) { inorder(r->Lchild); cout << r->data << " "; inorder(r->Rchild); } else return;}void BSTree::inorder(){ inorder(root);}bool BSTree::FindBSTree(Node *r, int &elem){ if (r == NULL) return false; else { if (elem == r->data) { elem = r->data; return true; } else if (elem < r->data) return FindBSTree(r->Lchild, elem); else return FindBSTree(r->Rchild, elem); }}void BSTree::InsertBSTree(Node *&r, const int elem){ if (r == NULL) { Node *p = new Node; p->data = elem; p->Lchild = NULL; p->Rchild = NULL; r = p; } else if (elem < r->data) InsertBSTree(r->Lchild, elem); else InsertBSTree(r->Rchild, elem);}bool BSTree::DeleteBSTree(Node *&r, const int &elem){ if (r == NULL) return false; if (elem == r->data) { Node *temp = r; if (r->Lchild == NULL)//左子树为空,根节点变成右子树 { r = r->Rchild; delete temp; } else if (r->Rchild == NULL)//右子树为空 { r = r->Lchild; delete temp; } else { if (r->Lchild->Rchild == NULL)//左孩子的右子树为空,则左孩子就是根节点的中序前件 { r->data = r->Lchild->data;//左子树赋给根节点 return DeleteBSTree(r->Lchild, r->Lchild->data);//删除左子树 } else//寻找左孩子的最右边的子树 { Node* p1 = r, *p2 = r->Lchild; while (p2->Rchild != NULL) { p1 = p2; p2 = p2->Rchild; } r->data = p2->data;//把最右边那个节点赋给根节点,然后删除 //return DeleteBSTree(p2, p2->data);//这句话不对,实际调试中现象异常诡异!!! return DeleteBSTree(p1->Rchild, p2->data); } } } else if (elem < r->data) DeleteBSTree(r->Lchild, elem); else DeleteBSTree(r->Rchild, elem);}
测试:
#include<iostream>#include"BST.h"using namespace std;int main(){ BSTree bst; int w[] = { 4,5,9,1,6,8,12,200,32,7,3,-5 }; cout << sizeof(w) << endl; bst.ConstructBSTree(w, sizeof(w)/sizeof(int)); bst.inorder();}
0 0
- 【二叉搜索数】HDU3791二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 【搜索树】二叉搜索树
- 二叉搜索树BSTree
- 二叉搜索树
- 二叉搜索树
- 二叉搜索树
- 最优二叉搜索树
- 二叉搜索树
- 二叉搜索树
- HDOJ3791 二叉搜索树
- 二叉查找树搜索
- 二叉搜索树
- 二叉搜索树
- BST 二叉搜索树
- 二叉搜索树
- java.util.Date和java.sql.Date的区别和相互转化
- Android第三方授权分享在新浪微博授权提示:文件不存在 C8998 的解决方法
- 基于Jetson TX1的faster-rcnn的算法搭建
- RxSwift (9) 调试符号
- SqlServer获取存储过程的返回值
- 二叉搜索树
- java FileInputStream 基础使用
- matlab管理内存方法---解决out of memory
- POJ 369 Meteor Shower——bfs
- 曼哈顿距离,欧式距离,余弦距离
- mybatis模糊查询
- Android 错误 'roundIcon' in package 'android'
- 构建Java Web开发环境
- java泛型类接口派生