亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++實現二叉查找樹示例

2020-01-26 15:35:36
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

/**
 實現二叉查找樹的基本功能
*/

#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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费电影在线观看| 国产成人激情视频| 国产在线视频欧美| 亚洲无限乱码一二三四麻| 国产精品最新在线观看| 亚洲一区二区久久久久久久| 久久久亚洲福利精品午夜| 久久精品国产精品| 日本精品久久久| 亚洲性日韩精品一区二区| 在线观看视频99| 国产精品久久久久久久久| 欧洲s码亚洲m码精品一区| 日韩精品有码在线观看| 国产精品高清在线| 国产精品成人免费电影| 黑人巨大精品欧美一区二区| 精品久久中文字幕| 日韩av网址在线观看| 日韩中文在线中文网在线观看| 日韩av网站在线| 日韩精品在线第一页| 日韩欧美主播在线| 欧美理论电影在线观看| 亚洲视频在线视频| 久久99久久99精品中文字幕| 夜夜嗨av一区二区三区四区| 久久久噜久噜久久综合| 日本午夜精品理论片a级appf发布| 国产一区二区三区三区在线观看| 97免费在线视频| 日韩欧美aaa| 国产女同一区二区| 中文字幕视频一区二区在线有码| 久久777国产线看观看精品| 夜夜嗨av一区二区三区四区| 国产视频精品久久久| 国产91色在线免费| 欧美成人精品h版在线观看| 高跟丝袜一区二区三区| 日韩成人av在线播放| 日本精品视频网站| 亚洲免费av电影| 日韩电视剧在线观看免费网站| 亚洲精品成人久久久| 欧美日韩另类视频| 最好看的2019的中文字幕视频| 欧美成人精品一区二区三区| 91av在线播放视频| 日本三级韩国三级久久| 成人国产在线激情| 精品欧美国产一区二区三区| 在线成人激情黄色| 国产精品久久久久久久久久免费| 国产精品高潮呻吟久久av黑人| 欧美日韩午夜激情| 91精品国产综合久久久久久久久| 92版电视剧仙鹤神针在线观看| 按摩亚洲人久久| 亚洲人成网站777色婷婷| 黄色成人在线免费| 国产视频亚洲视频| 精品国产欧美一区二区三区成人| 中文字幕欧美日韩va免费视频| 国产午夜精品一区理论片飘花| 国产ts一区二区| 国产日韩在线精品av| 欧美一区二区影院| 国产精品日韩在线| 亚洲天堂av网| 国模叶桐国产精品一区| 国产精品亚洲美女av网站| 欧美在线国产精品| 国产成人精品电影| 欧美激情视频一区二区三区不卡| 久久亚洲影音av资源网| 色系列之999| 九九精品在线播放| 国产美女久久精品香蕉69| 欧美日本高清视频| 人妖精品videosex性欧美| 色yeye香蕉凹凸一区二区av| 在线观看亚洲区| 日韩欧美在线免费观看| 国产精品视频网| 最新国产成人av网站网址麻豆| 亚洲最大福利网| 亚洲午夜激情免费视频| 国产日韩中文字幕在线| 欧美成在线观看| 亚洲国产成人久久综合| 亚洲精品自拍第一页| 国产精品91在线观看| 欧美日韩精品在线| 亚洲电影免费观看高清完整版| 日产日韩在线亚洲欧美| 一区二区三区视频免费在线观看| 亚洲精品视频久久| 欧美性20hd另类| 国产精品视频男人的天堂| 日韩免费在线视频| 欧美午夜片欧美片在线观看| 中文字幕自拍vr一区二区三区| 国产成人极品视频| 精品亚洲男同gayvideo网站| 亚洲精品自产拍| 久久久精品国产网站| 国产欧美一区二区三区久久人妖| 最近2019中文字幕大全第二页| 国产精品久久久一区| 精品久久久av| 国产美女久久精品香蕉69| 欧美日韩在线视频首页| 668精品在线视频| 欧美最顶级丰满的aⅴ艳星| 国产成人综合一区二区三区| 亚洲欧美日韩久久久久久| 亚洲综合中文字幕在线| 久久精品中文字幕免费mv| 亚洲成人亚洲激情| 国产亚洲欧洲在线| 国产精品日韩精品| 亚洲国产精品悠悠久久琪琪| 亚洲国产小视频| 亚洲天堂av综合网| 97在线视频免费看| 亚洲一级免费视频| 亚洲精品久久久久久久久| 精品久久久免费| 69影院欧美专区视频| 亚洲第一区第二区| 88国产精品欧美一区二区三区| 欧美成人午夜免费视在线看片| 亚洲欧美一区二区三区四区| 久久精品国产清自在天天线| 一区国产精品视频| 一区二区三区久久精品| 免费91麻豆精品国产自产在线观看| 中文国产成人精品久久一| 97超级碰碰碰久久久| 69久久夜色精品国产69| 久久久亚洲网站| 久久九九全国免费精品观看| 色综合久久久久久中文网| 欧美激情精品久久久久久免费印度| 欧美激情视频给我| 亚洲japanese制服美女| 亚洲在线观看视频网站| 一区二区三区美女xx视频| 精品亚洲va在线va天堂资源站| 亚洲欧美中文日韩v在线观看| 国模叶桐国产精品一区| 亚洲欧美国产高清va在线播| www.日韩免费| 日韩精品一二三四区| 国产精品视频成人| 日韩在线高清视频| 久久国产精品久久国产精品| 日本高清久久天堂| 日韩精品免费在线观看| 伊人激情综合网| 亚洲一区亚洲二区亚洲三区| 国产一区欧美二区三区| 亚洲欧美在线免费观看|