全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C语言实现二叉树的搜索及相关算法示例

本文实例讲述了C语言实现二叉树的搜索及相关算法。分享给大家供大家参考,具体如下:

二叉树(二叉查找树)是这样一类的树,父节点的左边孩子的key都小于它,右边孩子的key都大于它。

二叉树在查找和存储中通常能保持logn的查找、插入、删除,以及前驱、后继,最大值,最小值复杂度,并且不占用额外的空间。

这里演示二叉树的搜索及相关算法:

#include<stack>
#include<queue>
using namespace std;
class tree_node{
public:
  int key;
  tree_node *left;
  tree_node *right;
  int tag;
  tree_node(){
    key = 0;
    left = right = NULL;
    tag = 0;
  }
  ~tree_node(){}
};
void visit(int value){
  printf("%d\n", value);
}
// 插入
tree_node * insert_tree(tree_node *root, tree_node* node){
  if (!node){
    return root;
  }
  if (!root){
    root = node;
    return root;
  }
  tree_node * p = root;
  while (p){
    if (node->key < p->key){
      if (p->left){
        p = p->left;
      }
      else{
        p->left = node;
        break;
      }
    }
    else{
      if (p->right){
        p = p->right;
      }
      else{
        p->right = node;
        break;
      }
    }
  }
  return root;
}
// 查询key所在node
tree_node* search_tree(tree_node* root, int key){
  tree_node * p = root;
  while (p){
    if (key < p->key){
      p = p->left;
    }
    else if (key > p->key){
      p = p->right;
    }
    else{
      return p;
    }
  }
  return NULL;
}
// 创建树
tree_node* create_tree(tree_node *t, int n){
  tree_node * root = t;
  for (int i = 1; i<n; i++){
    insert_tree(root, t + i);
  }
  return root;
}
// 节点前驱
tree_node* tree_pre(tree_node* root){
  if (!root->left){ return NULL; }
  tree_node* p = root->left;
  while (p->right){
    p = p->right;
  }
  return p;
}
// 节点后继
tree_node* tree_suc(tree_node* root){
  if (!root->right){ return NULL; }
  tree_node* p = root->right;
  while (p->left){
    p = p->left;
  }
  return p;
}
// 中序遍历
void tree_walk_mid(tree_node *root){
  if (!root){ return; }
  tree_walk_mid(root->left);
  visit(root->key);
  tree_walk_mid(root->right);
}
// 中序遍历非递归
void tree_walk_mid_norecursive(tree_node *root){
  if (!root){ return; }
  tree_node* p = root;
  stack<tree_node*> s;
  while (!s.empty() || p){
    while (p){
      s.push(p);
      p = p->left;
    }
    if (!s.empty()){
      p = s.top();
      s.pop();
      visit(p->key);
      p = p->right;
    }
  }
}
// 前序遍历
void tree_walk_pre(tree_node *root){
  if (!root){ return; }
  visit(root->key);
  tree_walk_pre(root->left);
  tree_walk_pre(root->right);
}
// 前序遍历非递归
void tree_walk_pre_norecursive(tree_node *root){
  if (!root){ return; }
  stack<tree_node*> s;
  tree_node* p = root;
  s.push(p);
  while (!s.empty()){
    tree_node *node = s.top();
    s.pop();
    visit(node->key);
    if (node->right){
      s.push(node->right);
    }
    if (node->left){
      s.push(node->left);
    }
  }
}
// 后序遍历
void tree_walk_post(tree_node *root){
  if (!root){ return; }
  tree_walk_post(root->left);
  tree_walk_post(root->right);
  visit(root->key);
}
// 后序遍历非递归
void tree_walk_post_norecursive(tree_node *root){
  if (!root){ return; }
  stack<tree_node*> s;
  s.push(root);
  while (!s.empty()){
    tree_node * node = s.top();
    if (node->tag != 1){
      node->tag = 1;
      if (node->right){
        s.push(node->right);
      }
      if (node->left){
        s.push(node->left);
      }
    }
    else{
      visit(node->key);
      s.pop();
    }
  }
}
// 层级遍历非递归
void tree_walk_level_norecursive(tree_node *root){
  if (!root){ return; }
  queue<tree_node*> q;
  tree_node* p = root;
  q.push(p);
  while (!q.empty()){
    tree_node *node = q.front();
    q.pop();
    visit(node->key);
    if (node->left){
      q.push(node->left);
    }
    if (node->right){
      q.push(node->right);
    }
  }
}
// 拷贝树
tree_node * tree_copy(tree_node *root){
  if (!root){ return NULL; }
  tree_node* newroot = new tree_node();
  newroot->key = root->key;
  newroot->left = tree_copy(root->left);
  newroot->right = tree_copy(root->right);
  return newroot;
}
// 拷贝树
tree_node * tree_copy_norecursive(tree_node *root){
  if (!root){ return NULL; }
  tree_node* newroot = new tree_node();
  newroot->key = root->key;
  stack<tree_node*> s1, s2;
  tree_node *p1 = root;
  tree_node *p2 = newroot;
  s1.push(root);
  s2.push(newroot);
  while (!s1.empty()){
    tree_node* node1 = s1.top();
    s1.pop();
    tree_node* node2 = s2.top();
    s2.pop();
    if (node1->right){
      s1.push(node1->right);
      tree_node* newnode = new tree_node();
      newnode->key = node1->right->key;
      node2->right = newnode;
      s2.push(newnode);
    }
    if (node1->left){
      s1.push(node1->left);
      tree_node* newnode = new tree_node();
      newnode->key = node1->left->key;
      node2->left = newnode;
      s2.push(newnode);
    }
  }
  return newroot;
}
int main(){
  tree_node T[6];
  for (int i = 0; i < 6; i++){
    T[i].key = i*2;
  }
  T[0].key = 5;
  tree_node* root = create_tree(T, 6);
  //tree_walk_mid(root);
  //tree_walk_mid_norecursive(root);
  //tree_walk_pre(root);
  //tree_walk_pre_norecursive(root);
  //tree_walk_post(root);
  //tree_walk_post_norecursive(root);
  //tree_walk_level_norecursive(root);
  visit(search_tree(root, 6)->key);
  visit(tree_pre(root)->key);
  visit(tree_suc(root)->key);
  //tree_node* newroot = tree_copy_norecursive(root);
  //tree_walk_mid(newroot);
  return 0;
}

希望本文所述对大家C语言程序设计有所帮助。


# C语言  # 二叉树  # 搜索  # 算法  # C语言二叉树的三种遍历方式的实现及原理  # C语言数据结构之线索二叉树及其遍历  # c语言_构建一个静态二叉树实现方法  # 如何使用C语言实现平衡二叉树数据结构算法  # C语言二叉排序树的创建  # 插入和删除  # 遍历  # 递归  # 是这样  # 给大家  # 所述  # 最小值  # 不占用  # 讲述了  # namespace  # std  # tree_node  # stack  # gt  # queue  # public  # NULL  # void  # visit  # int 


相关文章: 如何用花生壳三步快速搭建专属网站?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  香港服务器租用费用高吗?如何避免常见误区?  建站之星如何优化SEO以实现高效排名?  建站之星会员如何解锁更多建站功能?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何获取免费开源的自助建站系统源码?  开源网站制作软件,开源网站什么意思?  江苏网站制作公司有哪些,江苏书法考级官方网站?  图册素材网站设计制作软件,图册的导出方式有几种?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  如何通过VPS建站无需域名直接访问?  开封网站制作公司,网络用语开封是什么意思?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何通过云梦建站系统实现SEO快速优化?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何在西部数码注册域名并快速搭建网站?  建站之星展会模版如何一键下载生成?  如何用PHP工具快速搭建高效网站?  建站之星代理商如何保障技术支持与售后服务?  如何登录建站主机?访问步骤全解析  建站之星3.0如何解决常见操作问题?  如何快速生成ASP一键建站模板并优化安全性?  红河网站制作公司,红河事业单位身份证如何上传?  如何续费美橙建站之星域名及服务?  如何通过商城自助建站源码实现零基础高效建站?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  建站之星代理费用多少?最新价格详情介绍  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何实现建站之星域名转发设置?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  免费视频制作网站,更新又快又好的免费电影网站?  如何解决ASP生成WAP建站中文乱码问题?  建站之星如何实现五合一智能建站与营销推广?  建站上传速度慢?如何优化加速网站加载效率?  公司网站设计制作厂家,怎么创建自己的一个网站?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何通过FTP服务器快速搭建网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何在阿里云香港服务器快速搭建网站?  如何挑选高效建站主机与优质域名?  建站主机选虚拟主机还是云服务器更好?  网页设计网站制作软件,microsoft office哪个可以创建网页?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。