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

5.3.数据结构-c/c++二叉树代码

二叉树的全部代码,可以直接运行 

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
#include<queue>
using namespace std;//定义节点
typedef int BTDataType;typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;//创建一个新节点
BTNode* CreatNode(int x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));assert(node);//更新节点的值,并将左右指针置空node->data = x;node->left = nullptr;node->right = nullptr;return node;
}//前序遍历
void PrevOrder(BTNode* root)
{if (root == nullptr){cout << "NULL ";return;}cout << (char)root->data << " ";	//访问根节点PrevOrder(root->left);		//访问左子树PrevOrder(root->right);		//访问右子树
}//中序遍历
void InOrder(BTNode* root)
{if (root == nullptr){cout << "NULL ";return;}//中序遍历前访问左子树,再访问根节点,最后访问右子树InOrder(root->left);		//访问左子树cout << (char)root->data << " ";	//访问根节点InOrder(root->right);		//访问右子树
}//后序遍历
void NextOrder(BTNode* root)
{if (root == nullptr){cout << "NULL ";return;}//后序遍历先访问左子树,在访问右子树。最后访问根节点NextOrder(root->left);		//访问左子树NextOrder(root->right);		//访问右子树cout << (char)root->data << " ";	//访问根节点
}//层序遍历(广度优先遍历),该遍历需要我们使用到队列先进先出的特点
void TreeLeverOrder(BTNode* root)
{if (root == nullptr){return;}queue<BTNode*> q;q.push(root);while (!q.empty()){BTNode* front = q.front();if (front->left){q.push(front->left);}if (front->right){q.push(front->right);}cout << (char)q.front()->data << " ";q.pop();}cout << endl;
}//销毁一棵树//使用后续销毁
void TreeDestory(BTNode* root)
{if (root == NULL)return;TreeDestory(root->left);TreeDestory(root->right);free(root);
}//求二叉树第k层结点的个数
int TreeKSize(BTNode* root, int k)
{if (root == nullptr)return 0;if (k == 1)return 1;return TreeKSize(root->left, k - 1) + TreeKSize(root->right, k - 1);
}//查找某个结点是否在二叉树种
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root == nullptr)return nullptr;if (root->data == x)return root;BTNode* node1 = TreeFind(root->left, x);if (node1 != nullptr)return node1;BTNode* node2 = TreeFind(root->right, x);if (node2 != nullptr)return node2;
}//遍历
void TreeSize1(BTNode* root, int* psize)
{if (root == nullptr)return;else(*psize)++;TreeSize1(root->left, psize);TreeSize1(root->right, psize);
}//分治
int TreeSize2(BTNode* root)
{if (root == nullptr)return 0;elsereturn 1 + TreeSize2(root->left) + TreeSize2(root->right);
}//求叶子节点个数
int TreeLeafSize(BTNode* root)
{if (root == nullptr)return 0;//保证遇到叶子节点的时候返回1if (root->left == nullptr && root->right == nullptr)return 1;//分治且其他所有节点都不返回return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}//求树的深度
int TreeDepth(BTNode* root)
{if (root == nullptr)return 0;int leftdepth = TreeDepth(root->left);int rightdepth = TreeDepth(root->right);if (leftdepth > rightdepth)return leftdepth + 1;elsereturn rightdepth + 1;
}//判断一棵树是否为完全二叉树
bool TreeComplete(BTNode* root)
{queue<BTNode*> q;//空树是完全二叉树if (!root)	return true;q.push(root);while (!q.empty()){BTNode* front = q.front();q.pop();if (front == nullptr)break;q.push(front->left);q.push(front->right);}//判断while (!q.empty()){BTNode* front = q.front();q.pop();if (front != nullptr)return false;}return true;
}int main()
{BTNode* A = CreatNode('A');BTNode* B = CreatNode('B');BTNode* C = CreatNode('C');BTNode* D = CreatNode('D');BTNode* E = CreatNode('E');BTNode* F = CreatNode('F');BTNode* G = CreatNode('G');A->left = B;A->right = C;B->left = D;B->right = E;C->left = F;C->right = G;int sizeA = 0;TreeSize1(A, &sizeA);cout << "TreeSize1:" << sizeA << endl;cout << "TreeSize2:" << TreeSize2(A) << endl;cout << "TreeLeafSize:" << TreeLeafSize(A) << endl;cout << "TreeDepth:" << TreeDepth(A) << endl;cout << "k=3 TreeKsize:" << TreeKSize(A, 3) << endl;if (TreeComplete(A))cout << "是完全二叉树" << endl;elsecout << "不是完全二叉树" << endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言-第八章:指针进阶
  • 保研 比赛 利器: 用AI比赛助手降维打击数学建模
  • 内推|京东|后端开发|运维|算法...|北京 更多岗位扫内推码了解,直接投递,跟踪进度
  • 数据传输安全——混合加解密
  • 压缩PDF,介绍这五种压缩方案
  • 什么是Web服务器集群?
  • springboot服务器文件读取工具类
  • 一文梳理RAG(检索增强生成)的现状与挑战
  • Go语言结构体和元组全面解析
  • 【IPV6从入门到起飞】4-RTMP推流,ffmpeg拉流,纯HTML网页HLS实时直播
  • PyTorch 卷积层详解
  • 什么是银行挤兑
  • throw 和 throws及Throwable区别和联系各自的使用场景
  • 4.4 版本管理器——VM实现
  • if语句:悬空else问题
  • ES6指北【2】—— 箭头函数
  • 时间复杂度分析经典问题——最大子序列和
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • extjs4学习之配置
  • JAVA 学习IO流
  • JS基础之数据类型、对象、原型、原型链、继承
  • Magento 1.x 中文订单打印乱码
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • php ci框架整合银盛支付
  • PHP那些事儿
  • WePY 在小程序性能调优上做出的探究
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 初识 webpack
  • 如何在 Tornado 中实现 Middleware
  • 入门级的git使用指北
  • 我从编程教室毕业
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 项目实战-Api的解决方案
  • 学习笔记:对象,原型和继承(1)
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • linux 淘宝开源监控工具tsar
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • # include “ “ 和 # include < >两者的区别
  • #Linux(Source Insight安装及工程建立)
  • #NOIP 2014# day.2 T2 寻找道路
  • #NOIP 2014#Day.2 T3 解方程
  • #stm32驱动外设模块总结w5500模块
  • #window11设置系统变量#
  • (4)logging(日志模块)
  • (备份) esp32 GPIO
  • (分布式缓存)Redis哨兵
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (面试必看!)锁策略
  • (四) Graphivz 颜色选择
  • (四)事件系统
  • (一)UDP基本编程步骤
  • .bashrc在哪里,alias妙用
  • .NET Core 中插件式开发实现
  • .NET delegate 委托 、 Event 事件