当前位置: 首页 > backend >正文

数据结构二叉树与二叉搜索树c实现代码

二叉树

#include <stdio.h>
#include <stdlib.h>#define MAXNODE 100
typedef int ElementType;/*----------结构体-------------*/
typedef struct BinNode {ElementType Element;struct BinNode *lchild, *rchild;
} BinNode, *BinTree;/*------------先序遍历--------------*/
void PreOrder(BinTree T) {if (T) {printf("%c", T->Element);PreOrder(T->lchild);PreOrder(T->rchild);}
}/*----------中序遍历---------------*/
void InOrder(BinTree T) {if (T) {InOrder(T->lchild);printf("%c", T->Element);InOrder(T->rchild);}
}/*-------------后序遍历---------------*/
void PostOrder(BinTree T) {if (T) {PostOrder(T->lchild);PostOrder(T->rchild);printf("%c", T->Element);}
}/*-----------层级遍历---------------*/
void LevelOrder(BinTree T) {if (!T) return;// 创建队列BinTree queue[MAXNODE];  // 树节点不超过MAXNODE个int front = 0, rear = 0;// 根节点入队queue[rear++] = T;// 当队列不为空时循环while (front < rear) {// 出队并访问BinTree current = queue[front++];printf("%c", current->Element);// 左子树入队if (current->lchild)queue[rear++] = current->lchild;// 右子树入队if (current->rchild)queue[rear++] = current->rchild;}
}/*-----------创建新节点---------------*/
BinTree CreateNode(ElementType value) {BinTree newNode = (BinTree)malloc(sizeof(BinNode));if (newNode == NULL) {printf("内存分配失败!\n");return NULL;}newNode->Element = value;newNode->lchild = NULL;newNode->rchild = NULL;return newNode;
}/*-----------创建空树---------------*/
BinTree CreateEmptyTree() {return NULL;
}/*-----------构建二叉树(通过前序遍历输入)---------------*/
BinTree BuildTree() {char ch;scanf(" %c", &ch);  // 读取一个字符,忽略空白if (ch == '#') {  // 使用 '#' 表示空节点return NULL;} else {BinTree T = CreateNode(ch);printf("输入 %c 的左子树:", ch);T->lchild = BuildTree();printf("输入 %c 的右子树:", ch);T->rchild = BuildTree();return T;}
}/*-----------插入节点(这里实现为二叉搜索树的插入)---------------*/
BinTree InsertNode(BinTree T, ElementType value) {if (T == NULL) {return CreateNode(value);}if (value < T->Element) {T->lchild = InsertNode(T->lchild, value);} else if (value > T->Element) {T->rchild = InsertNode(T->rchild, value);}// 如果值相等,不插入(假设不允许重复值)return T;
}/*-----------查找节点---------------*/
BinTree FindNode(BinTree T, ElementType value) {if (T == NULL || T->Element == value) {return T;}if (value < T->Element) {return FindNode(T->lchild, value);} else {return FindNode(T->rchild, value);}
}/*-----------获取树高度---------------*/
int GetHeight(BinTree T) {if (T == NULL) {return 0;}int leftHeight = GetHeight(T->lchild);int rightHeight = GetHeight(T->rchild);return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}/*-----------获取节点数量---------------*/
int GetNodeCount(BinTree T) {if (T == NULL) {return 0;}return GetNodeCount(T->lchild) + GetNodeCount(T->rchild) + 1;
}/*-----------获取叶子节点数量---------------*/
int GetLeafCount(BinTree T) {if (T == NULL) {return 0;}if (T->lchild == NULL && T->rchild == NULL) {return 1;}return GetLeafCount(T->lchild) + GetLeafCount(T->rchild);
}/*-----------判断是否为空树---------------*/
int IsEmpty(BinTree T) {return T == NULL;
}/*-----------判断是否为完全二叉树---------------*/
int IsComplete(BinTree T) {if (T == NULL) {return 1; // 空树视为完全二叉树}BinTree queue[MAXNODE];int front = 0, rear = 0;int flag = 0; // 标记是否遇到了非满节点queue[rear++] = T;while (front < rear) {BinTree current = queue[front++];if (current->lchild) {if (flag) return 0; // 已经遇到过非满节点,但又发现了新节点queue[rear++] = current->lchild;} else {flag = 1; // 遇到非满节点}if (current->rchild) {if (flag) return 0; // 已经遇到过非满节点,但又发现了新节点queue[rear++] = current->rchild;} else {flag = 1; // 遇到非满节点}}return 1;
}/*-----------判断是否为满二叉树---------------*/
int IsFull(BinTree T) {if (T == NULL) {return 1; // 空树视为满二叉树}int height = GetHeight(T);int nodeCount = GetNodeCount(T);// 满二叉树的节点数 = 2^height - 1return nodeCount == (1 << height) - 1;
}/*-----------销毁树---------------*/
void DestroyTree(BinTree T) {if (T == NULL) {return;}DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);
}/*-----------复制树---------------*/
BinTree CopyTree(BinTree T) {if (T == NULL) {return NULL;}BinTree newTree = CreateNode(T->Element);newTree->lchild = CopyTree(T->lchild);newTree->rchild = CopyTree(T->rchild);return newTree;
}/*-----------镜像/翻转树---------------*/
void MirrorTree(BinTree T) {if (T == NULL) {return;}// 交换左右子树BinTree temp = T->lchild;T->lchild = T->rchild;T->rchild = temp;// 递归镜像左右子树MirrorTree(T->lchild);MirrorTree(T->rchild);
}
#include <stdio.h>
#include <stdlib.h>typedef  int ElementType;typedef struct TreeNode
{ElementType data;struct TreeNode *left;struct TreeNode *right;
}*SearchTree,*position;/*插入结点*/
SearchTree Insert(ElementType x,SearchTree T){if(T==NULL){T=(SearchTree)malloc((sizeof(struct TreeNode)));T->data-x;T->left=NULL;T->right=NULL;}else if(x<T->data){T->left=Insert(x,T->data);}else if (x>T->data){T->right=Insert(x,T->right);}return T;
}/*创建二叉搜索树*/
SearchTree CreatBST(SearchTree T,int a[],int n){int i;T=NULL;for(i=0;i<n;i++){Insert(a[i],T);}return T;
}/*清空二叉搜索树*/
SearchTree MakeEmpty(SearchTree T){if(T!=NULL){MakeEmpty(T->left);MakeEmpty(T->right);free(T);}return NULL;
}/*查找指定值*/
position Find(ElementType x,SearchTree T){if(T==NULL){return NULL;}if(x<T->data){return Find(x,T->left);}else if(x<T->data){return Find(x,T->right);}else{return T;}
}/*查找最小值*/
position FindMin(SearchTree T){if (T==NULL){return NULL;}else if(T->left==NULL){return T;}elsereturn FindMin(T->left);
}/*查找最大值*/
position FindMax(SearchTree T){if(T==NULL){return NULL;}else if(T->right==NULL){return T;}elsereturn FindMax(T->right);
}SearchTree Delete(ElementType x,SearchTree T){position Tmpcell;if(T==NULL){printf("Element Not Found!");}else if(x<T->data){T->left=Delete(x,T->left);}else if(x>T->data){T->right=Delete(x,T->right);}else{if(T->left && T->right){Tmpcell=FindMin(T->right);T->data=Tmpcell->data;T->right=Delete(T->data,T->right);}else{Tmpcell=T;if(T->left==NULL){T=T->right;}else if (T->right==NULL){T=T->left;}}free(Tmpcell);}return T;
}
http://www.xdnf.cn/news/2535.html

相关文章:

  • SVT-AV1源码分析-函数svt_aom_motion_estimation_kernel
  • 解决Keil/MDK无法跳转(go to define)问题
  • 2025年AEJ SCI2区:增强麻雀搜索算法CERL-SSA+工业物联网感知通信,深度解析+性能实测
  • SpringBoot配置RestTemplate并理解单例模式详解
  • layui获取无法获取表单数据,data.field一直为空
  • SPL 量化 复权数据
  • 双指针算法(2)——复写零
  • GAMES202-高质量实时渲染(Real-Time Shadows)
  • STM32 CAN通信 HAL库实战教程:从零到测试成功
  • 【计算机网络分类全解析】从局域网到广域网的工程实践
  • 【三大特性】虚表 内存分布
  • Marmoset Toolbag 5.0 中文汉化版 八猴软件中文汉化版 免费下载
  • C# 类(Class)教程
  • 浮点数:IEEE 754标准
  • PCIe 转 U.2 接双硬盘指南 - 超微(Supermicro)主板
  • Mysql如何高效的查询数据是否存在
  • 理解 Kubernetes 初始访问向量(一)——控制平面
  • 【Webpack \ Vite】多环境配置
  • makefile总结
  • 关于Spark知识点与代码测试的学习总结
  • 单片机 + 图像处理芯片 + TFT彩屏 复选框控件
  • 30-算法打卡-字符串-重复的子字符串-leetcode(459)-第三十天
  • 使用 Cherry Studio 调用高德 MCP 服务
  • NFS从零部署
  • 华为 CCE 查看节点剩余可调度cpu核数
  • 从零实现分布式WebSocket组件:设计模式深度实践指南
  • 路由协议基础
  • babel和loader的关系
  • 微深节能 平板小车运动监测与控制系统 格雷母线
  • LeetCode题解1297. 子串的最大出现次数