• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c++实现二叉查找树示例

c++实现二叉查找树示例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了二叉查找树c++,c++校门外的树,哈夫曼树编码c++,c++二叉树,c++二叉树的建立等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <string>

using namespace std;

const int M = 10000;

//定义数据节点
class dNode{
public:
 string name;
 int age;
 bool sex;
 dNode(){
  age = 0;
  name = "no name";
  sex = true;//nan
 }
 dNode(string name, int age, bool sex):name(name), age(age), sex(sex){}
 //打印节点
 void show(){
  cout << "name: " << this->name << endl;
  cout << "age: " << this->age << endl;
  cout << "sex: " << this->sex << endl;
  cout << "******************************" << endl;
 }
 //重载赋值符号
 bool operator = (const dNode &d){
  this->age = d.age;
  this->name = d.name;
  this->sex = d.sex;
 }
 //重载相等符号
 bool operator == (const dNode &d){
  return name == d.name && age == d.age && sex == sex;
 }
 //按照年龄重载大于符号
 bool operator > (const dNode &d){
  return age > d.age;
 }
 //按照年龄重载小于符号
 bool operator < (const dNode &d){
  return age < d.age;
 }

};
//定义二叉查找树的节点
//这里规定树中没有重复节点,这里需要对一个节点记录出现多少次
class bstNode{
public: 
 bstNode *left;
 bstNode *right;
 bstNode *parent; //执行父亲,便于向上访问,如果数据量大,并且向上找的使用率不大就不要来减少空间
 dNode data;  //该节点在树中出现的次数
 int count;
 bstNode(){
  left = right = parent = NULL;
  count = 1;
 }
};
//定义二叉树
class bst{
private:
 //清理整棵树
 //注意,一定一定要后续遍历的方法清理
 void destory(bstNode *cur){
  if(NULL == cur){
   return;
  }
  cout << "clearing" << endl;
  destory(cur->left);
  destory(cur->right);
  delete cur; //后续清理
 }
 //真正的删除节点
 void _del(bstNode * cur, bstNode *delNode);
public:
 bstNode * root = NULL;
 bst(){
  root = NULL;
 }
 //插入,返回值是便于构造parent关系
 bstNode * insert(bstNode *& cur, dNode data);
 //搜索
 bstNode * search(bstNode * cur, dNode data);
 //先序遍历
 void pre_raversal(bstNode *cur);
 //返回cur为根的节点的最小值
 bstNode * minNode(bstNode *cur);
 //得到cur节点的后继
 bstNode * succNode(bstNode *cur);
 //删除节点,如果count大于1就将count - 1,如果count==1就清除该节点,返回清除的节点的地址
 bstNode * del(bstNode *cur, dNode data);
 //构造函数对树做清理工作
 virtual ~bst(){
  cout << "###start clear###" << endl;
  this->destory(root);
  cout << "###clear ok###" << endl;
 }

};
bstNode * bst::insert(bstNode *& cur, dNode data){
 if(NULL == cur){
  bstNode * newNode = new bstNode();
  newNode->data = data;
  cur = newNode;
  return cur;
 }else if(cur->data == data){
  cur->count++;
 }else if(cur->data > data){
  bst::insert(cur->left, data)->parent = cur;
 }else if(cur->data < data){
  bst::insert(cur->right, data)->parent = cur;
 }
}
bstNode * bst::search(bstNode *cur, dNode data){
 if(NULL == cur){
  return NULL;
 }else if(cur->data == data){
  return cur;
 }else if(cur->data > data){
  return cur->left;
 }else if(cur->data < data){
  return cur->right;
 }
}
void bst::pre_raversal(bstNode *cur){
 if(NULL == cur)
  return;
 bst::pre_raversal(cur->left);
 cout << "count: " << cur->count << endl;
 cur->data.show();
 bst::pre_raversal(cur->right);
}
bstNode * bst::minNode(bstNode *cur){
 if(NULL == cur){
  return NULL; //如果根节点是空,就返回空
 }else{
  if(NULL != cur->left){
   return minNode(cur->left);
  }
 }
}
/**
* 非递归
* 后继就是比cur节点刚好大一点儿的节点A(排序之后),那么思
* 路就是找cur节点的右子树中的最小值或者是在cur的祖先中找到第一个比刚好大一点儿的那个节点
* ***找到A有两种情况:
* 1.cur节点有右子树,那么就找右子树的最小值节点就好了
* 2.cur节点没有右子树,那么一级一级的向祖先找,直到某个祖先节点A满足,
*   A的左孩子是cur的祖先,因为当A的左孩子是cur祖先就说明查找路线在想右
*   偏了,之前一直是往左边偏
*/
bstNode * bst::succNode(bstNode *cur){
 if(NULL != cur->right){
  return minNode(cur);
 }
 bstNode * parentNode = cur->parent;
 while(NULL != parentNode && parentNode->right == cur){
  cur = parentNode;
  parentNode = parentNode->parent;
 }
 return parentNode;
}

/**
*
* 删除c节点,这个是最难的
* 规定:要删除的节点是c, c的父节点是p, c的后继是s,c的左孩子是l,有孩子是r
* 删除c整个节点(不是count-1)分三种情况
* 1. c节点没有孩子,直接删除
* 2. c节点有一个孩子,那么直接将孩子节点(l或r)指向c的父节点p(p也要执行l或r)
* 3. c有两个孩子,那么需要用后继节s点里面的数据掉替换c节点里面的数据,然后再删除s节点
*    同时需要将s父子之间的指向关系处理好
*/
void bst::_del(bstNode * cur, bstNode *delNode){
 if(NULL == delNode->left || NULL == delNode->right){
  //待续
 }
}

/**
*接口:
*跟count有关的删除
*/
bstNode * bst::del(bstNode *cur, dNode data){
 //先找到需要删除的节点
 bstNode * delNode = this->search(cur, data);
 if(NULL == delNode) //没有找到该节点,无需删除
  return NULL;
 if(delNode->count == 1){
  _del(this->root, delNode);
 }else{
  delNode->count--;
 }
}

int main(){
 bst *root = new bst();
 //构造50个人, 重复的虽然在树中不会重复插入,但是会被计数
 int num = 50;
 for(int i = 0; i < num; i++){
  dNode * newData = new dNode("Luo", rand() % 15, rand() % 2);
  root->insert(root->root, *newData);
 }
 //前序遍历
 root->pre_raversal(root->root);

 bstNode *searchNode = root->search(root->root, *new dNode("Luo", 3, 1));
 cout << "#######search a Node ##########" << endl;
 if(NULL == searchNode){
  cout << "没有找到该节点" << endl;
 }else{
  cout << "count: " << searchNode->count << endl;
  searchNode->data.show();
 }
 //清理整棵树
 delete root;

 return 0;
}
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c++实现二叉查找树示例

相关文章

  • 2017-05-28VC中SendMessage和PostMessage的区别
  • 2017-05-28C/C++实现快速排序的方法
  • 2017-05-28C语言循环队列的表示与实现实例详解
  • 2017-05-28深入解析C语言中typedef的四个用途
  • 2017-05-28Linux下编译C程序的过程
  • 2017-05-28C++中的重载、覆盖、隐藏介绍
  • 2017-05-28C语言数据类型转换实例代码
  • 2017-05-28C语言中fchdir()函数和rewinddir()函数的使用详解
  • 2017-05-28C语言自动生成enum值和名字映射代码
  • 2017-05-28C语言中函数与指针的应用总结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈C++对象的内存分布和虚函数表
    • 详解C语言中strcpy()函数与strncpy()函数的使用
    • C语言中查找字符在字符串中出现的位置的方法
    • VC多线程编程详解
    • 图像旋转(1.8编程基础之多维数组)
    • C++空类默认函数详细解析
    • c语言网络编程-标准步骤(改进版)
    • C读txt到二维数组的实现方法
    • C++ 如何用cout输出hex,oct,dec的解决方法
    • 安装OpenMPI来配合C语言程序进行并行计算

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有