C语言实现二叉树的搜索及相关算法示例
发布时间 - 2026-01-11 01:47:45 点击率:次本文实例讲述了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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
香港服务器WordPress建站指南:SEO优化与高效部署策略
公司门户网站制作流程,华为官网怎么做?
JavaScript如何实现继承_有哪些常用方法
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何打造高效商业网站?建站目的决定转化率
详解Huffman编码算法之Java实现
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
百度浏览器如何管理插件 百度浏览器插件管理方法
如何在阿里云香港服务器快速搭建网站?
js代码实现下拉菜单【推荐】
如何快速生成凡客建站的专业级图册?
如何确保西部建站助手FTP传输的安全性?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何使用Collections进行数据处理?(实用方法示例)
Android 常见的图片加载框架详细介绍
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
详解Android图表 MPAndroidChart折线图
如何为不同团队 ID 动态生成多个独立按钮
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
Java遍历集合的三种方式
iOS中将个别页面强制横屏其他页面竖屏
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
利用JavaScript实现拖拽改变元素大小
如何解决hover在ie6中的兼容性问题
用yum安装MySQLdb模块的步骤方法
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
如何快速辨别茅台真假?关键步骤解析
EditPlus中的正则表达式 实战(4)
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel怎么清理缓存_Laravel optimize clear命令详解
LinuxCD持续部署教程_自动发布与回滚机制
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
如何快速生成高效建站系统源代码?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
简单实现Android验证码
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
深圳网站制作的公司有哪些,dido官方网站?
如何在Windows 2008云服务器安全搭建网站?
简历在线制作网站免费版,如何创建个人简历?

