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

链式二叉树

二叉树的遍历

定义和创建二叉树

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//定义二叉树节点
typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
} BTNode;
//创建二叉树节点
BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("BuyNode()::malloc fail");
		return NULL;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;
	return node;
}
//随意创建一个二叉树
BTNode* CreatTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;

	return node1;
}

遍历代码

//前序遍历
void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}
//中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}
//后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}

测试

int main()
{
	BTNode* root = CreatTree();
	PreOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PostOrder(root);
	printf("\n");
	return 0;
}

结果
在这里插入图片描述

二叉树的节点个数

一般方法

int TreeSize(BTNode* root, int* psize)
{
	if (root == NULL)
		return;
	(*psize)++;
	TestSize(root->left, psize);
	TestSize(root->right, psize);
}
int main()
{
	BTNode* root = CreatTree();
	PreOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PostOrder(root);
	printf("\n");

	int size = 0;//使用前要置0
	TreeSize(root, &size);
	printf("%d\n", size);
	return 0;
}

指挥打工人

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 ://若遇到空指针,则返回0
		TreeSize(root->left)
		+ TreeSize(root->right)
		+ 1;//1是自身的节点
}

二叉树的深/高度

int TreeHeight(BTNode* root)
{
	if (root == NULL)
		return 0;
	return TreeHeight(root->left) > TreeHeight(root->right) 
		? TreeHeight(root->left) + 1 
		: TreeHeight(root->right) + 1;
}

这样写可以完成计算深度的任务,但是不好,因为每次TreeHeight(root->left)TreeHeight(root->right) 都会调用至少一遍,第一次是 前的判断条件,第二次是要返回的值。
相当于一次比较知道谁大,但是不知道深度是多少,又要返回去计算,叶节点会被调用很多遍。
这样写显得臃肿。过于浪费算力资源,在大型场景跑不过。运算次数呈指数级增长。


改进后:

int TreeHeight(BTNode* root)
{
	if (root == NULL)
		return 0;
	int left = TreeHeight(root->left);
	int right = TreeHeight(root->right);
	return left > right ? left + 1 : right + 1;
}

根的第k层个数

公式:
根的第k层个数 = 左子树的第k-1层个数 + 右子树的第k层个数

int TreeKLevel(BTNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

相关文章:

  • 在 Ansys Mechanical 中解决干涉拟合
  • <modal>修改取消按钮样式
  • 半导体芯片制造中 W CVD(钨化学气相沉积)
  • Android开发弹框在底部显示
  • Markdown
  • 深入理解指针2
  • 【一条龙教程】用AI DS+创作原创音乐 (配合Midjourney漫画)制作原创MTV
  • vue3:vue3项目安装并引入Element-plus
  • 深入探讨分布式事务解决方案:从二阶段提交到现代模式
  • Github项目管理之 其余分支同步main分支
  • pip太慢了怎么办 换源下载
  • 【Uniapp-Vue3】导入uni-id用户体系
  • Linux中文件目录类指令
  • [杂学笔记]OSI七层模型作用、HTTP协议中的各种方法、HTTP的头部字段、TLS握手、指针与引用的使用场景、零拷贝技术
  • Python 批量横屏转竖屏视频处理工具
  • 一文掌握python中正则表达式的各种使用
  • Zetero导出文献附件和题录到Endnote
  • Imagination 最新的D系列GPU IP 为智能手机和其他电力受限设备上图形和计算工作负载的高效加速设定了新的标准
  • 【视频2 - 4】初识操作系统,Linux,虚拟机
  • git基本用法
  • 行业外贸网站建设/7个湖北seo网站推广策略
  • 佛山做网站开发/北京网络营销推广公司
  • html网站分页怎么做/2345网址导航官方网站
  • 我想自己做一个网站/怎么在百度推广
  • wordpress 离线/太原百度网站快速优化
  • wordpress主题 怎么安装/沈阳seo技术