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

代码贴--二叉树(链式结构)

本次用了一个文件

#include<bits/stdc++.h>
using namespace std;

typedef struct TreeNode
{
	struct TreeNode* left;
	struct TreeNode* right;
	int val;
}BTNode;


//手搓一棵树
BTNode* BuyBTNode(int val)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	newnode->val = val;
	newnode->right = NULL;
	newnode->left = NULL;
	return newnode;
}
BTNode* CreateTree()
{
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);

	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;

	return n1;
}

//		前中后序
void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		cout << "N";
		return;
	}
		
	cout << root->val;
	PreOrder(root->left);
	PreOrder(root->right);
}

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		cout << "N";
		return;
	}

	InOrder(root->left);
	cout << root->val;
	InOrder(root->right);
}

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		cout << "N";
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	cout << root->val;
}

//有线程安全的风险,有可能多个线程都在调用这个变量
//int size = 0;//但是在每次调用前都需要赋值为0

//void TreeSize(BTNode* root, int* psize)
//{
//	//static int size = 0;//静态变量存在静态区,不会随函数结束而被销毁。但是!!!静态变量只会被初始化一次!!!多次调用就会出现问题
//	if (root == NULL)
//		return ;
//	else
//		++(*psize);
//
//	TreeSize(root->left , psize);
//	TreeSize(root->right , psize);
//}

//分治法
int TreeSize(BTNode* root)
{
	return root == NULL ? 0 :TreeSize(root->left)+ TreeSize(root->right)+1;//1是指自己,根节点
}

int maxDepth(BTNode* root)
{
	if (root == NULL)
		return 0;

	int leftDepth = maxDepth(root->left);
	int rightDepth = maxDepth(root->right);
	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;//时间复杂度是O(N)注意尽量不要在三目运算符中使用多层次递归调用
	//return maxDepth(root->left) > maxDepth(root->right) ? maxDepth(root->left) + 1 :maxDepth(root->right) + 1;
	//以上的写法,没有记录的话,在每层比较时都需要向下层询问出现二次调用,递归等比数列,公比是叉数,时间复杂度是O(2^N)
}

int TreeHeight(BTNode* root)
{
	return maxDepth(root);
}

//二叉树第k层的节点个数
int TreeKLever(BTNode* root,int k)
{
	assert(k);
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	
	//不为空,且k>1说明第k层的节点在子树里面,转换成子问题求解
	return TreeKLever(root->left, k - 1) + TreeKLever(root->right, k - 1);
}

//查找x所在的节点
BTNode* TreeFind(BTNode* root, int x)
{
	if (root == NULL)
		return NULL;
	if (root->val==x)
		return root;

	BTNode* ret1 = TreeFind(root->left, x);
	if (ret1)
		return ret1;

	BTNode* ret2 = TreeFind(root->right, x);
	if (ret2)
		return ret2;

	//也可以直接返回ret2
	//return TreeFind(root->right, x);

	return NULL;
}


int main()
{
	BTNode* root = CreateTree();
	PreOrder(root);
	cout << endl;
	InOrder(root);
	cout << endl;
	PostOrder(root);
	cout << endl;
	/*int size = 0;
	TreeSize(root, &size);
	cout << size;*/

	cout << TreeSize(root);

	return 0;
}

http://www.dtcms.com/a/59458.html

相关文章:

  • 如何利用DeepSeek+OCR技术打造一款AI投标工具:自动解析招标文件并生成投标标书的工具?
  • Ubuntu无风扇工控机:解决精密仪器散热难题的利器
  • Python笔记(简单版)
  • SmolVLM2 - 将视频理解带到每个设备
  • 【从零开始学习计算机科学】计算机组成原理(四)指令系统
  • 核函数及其常见类型
  • 视觉图像处理
  • Day05 实例:正向反向连接内外网环境防火墙出入站
  • 【HarmonyOS Next】鸿蒙应用故障处理思路详解
  • Java常用集合与映射的线程安全问题深度解析
  • 【CSS3】筑基篇
  • Google参数逆向 谷歌搜索
  • C++蓝桥杯基础篇(十)
  • tcc编译器教程2 编译lua解释器
  • 如何在内网私有化离线部署AI大模型?有哪些AI模型可以在内网环境私有化离线部署?
  • 雪花算法
  • 1.python基础知识点1
  • STM32全系大阅兵(1)
  • 【Python】omegaconf 用法详解
  • 爬虫案例十二js 逆向模拟登录集思录网
  • [MERN] 使用 socket.io 实现即时通信功能
  • 【网络编程】事件选择模型
  • 数据库的安装与配置和创建数据库与表
  • PHIAF:基于GAN的数据增强和基于序列的特征融合的噬菌体-宿主相互作用预测
  • 现代互联网网络安全与操作系统安全防御概要
  • 采用内存局部性分配有什么好处?
  • 蓝队第三次
  • RocketMQ控制台显示NOT_CONSUME_YET
  • C++—list类的使用及模拟实现
  • C语言学习day25:WinAPI编程进阶02-第一个窗口应用程序开发