二叉树的各种操作

百练 二叉树的操作(二叉树) 二叉树的操作 查看提交统计提问 总时间限制: 1000ms 内存限制: 65535kB 描述 给定一棵二叉树,在二叉树上执行两个操作: 1. 节点交换 把二叉树的两个节点交换。 2. 前驱询问 询问二叉树的一个节点对应的子树最左边的节点。 输入第一行输出一个整数t(t 对于每组测试数据,第一行输入两个整数n m,n代表二叉树 阅读详情

一、二叉树的遍历

前序遍历:访问根节点的操作发生在遍历左右子树之前

中序遍历:访问根节点的操作发生在遍历其左右子树中间。

后序遍历:访问根节点的操作发生在遍历其左右子树之后。

这三种遍历方式都属于递归遍历。还有一种遍历方式叫做层序遍历,属于非递归遍历。

BFS是广度优先的遍历,DFS是深度优先的遍历。

接下来我们需要讲这些遍历方式用代码实现出来。为了方便,我们先手搓一棵如图的二叉树出来。

//自己搓一棵树出来
TreeNode* BuyNode(BTDataType x)
{
	TreeNode* newnode = (TreeNode*)malloc(sizeof(BTDataType));
	if (newnode == NULL)
	{
		perror("malloc");
		return NULL;
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

TreeNode* CreateBinaryTree()
{
	TreeNode* node1 = BuyNode(1);
	TreeNode* node2 = BuyNode(2);
	TreeNode* node3 = BuyNode(3);
	TreeNode* node4 = BuyNode(4);
	TreeNode* node5 = BuyNode(5);
	TreeNode* node6 = BuyNode(6);

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

	return node1;
}

然后,我们实现前序遍历的代码:

void PrevOrder(TreeNode* root)//前序遍历
{
	if (root == NULL)
	{
		printf("N ");//空树不可再分解,打印一个N
		return;
	}

	printf("%d ",root->data);//先访问根节点
	PrevOrder(root->left);
	PrevOrder(root->right);//递归方式访问左右子树

}

int main()
{
	TreeNode* root = CreateBinaryTree();
	PrevOrder(root);
	printf("\n");

	return 0;
}

运行结果如图:

中序遍历的代码实现也差不多,只不过是调换了顺序:

void InOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

int main()
{
	TreeNode* root = CreateBinaryTree();
	InOrder(root);
	printf("\n");

	return 0;
}

后序遍历也一样。

做一道前序遍历的算法题:

题干是这样的:

int* preorderTraversal(struct TreeNode* root, int* returnSize)

这里传递的参数returnSize是用来记录返回的数组的大小的。但凡要返回数组的函数,都应该有这样一个参数。

我们先计算一下二叉树的节点个数作为返回的returnSize。求节点个数的方法就在下面,这篇文章的第二部分↓

int TreeSize(struct TreeNode* root)
{
    if(root == NULL)
        return 0;
    return TreeSize(root->left) + TreeSize(root->right) + 1;
}

现在我们就知道要开辟一个多大的数组来存放遍历的结果了。

然后我们再写一个函数用于前序遍历并且把遍历结果放进数组中。此处我们需要传递一个指针来记录当前的下标,否则整型变量的作用域只在当前的函数中,没有办法一直++。

然后返回这个数组就好了。

void preOrder(struct TreeNode* root, int* a,int* pi)
{
    if(root == NULL)
        return;
    a[(*pi)++] = root->val;
    preOrder(root->left,a,pi);
    preOrder(root->right,a,pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    //returnSize 是为了记录数组的大小
    int* a = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;
    preOrder(root, a, &i);
    return a;
}

二、求二叉树节点的个数

最先想到的肯定是遍历的时候用一个size变量记录节点个数,但是由于是递归调用,每次调用的时候size都会归零。

我们考虑用静态变量来记录,但是这就产生了另一个问题:这个函数只能用一次,否则第二次用的时候就会从上一次算完的地方累加。

那我们再考虑用外部变量来记录,传这个外部变量的指针,写出来的代码是这样的:

void TreeSize(TreeNode* root, int* psize)
{
	if (root == NULL)
		return 0;
	else
		++(*psize);
	TreeSize(root->left, psize);
	TreeSize(root->right, psize);
}

int main()
{
	TreeSize(root, &size);
	printf("Treesize:%d ", size);
	return 0;
}

但是这样还是麻烦。更好的思路是分治递归:

如果根节点为空,就是零个节点(最小子问题)

如果根节点不为空,那么可以分为左子树节点数+右子树节点数+1(1表示这个根节点自己)。

代码实现非常简单,只需要一行:

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

三、求二叉树叶子节点的个数

首先想到的是这样写:(注意以下为错误示范)

如果一个节点左右子树都为空,那么这个节点就是叶子节点。某一个节点下的所有叶子节点等于它的左子树中的所有叶子节点和右子树的所有叶子节点的数量之和。

int TreeLeafSize(TreeNode* root)
{
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	else
	{
		return (TreeLeafSize(root->left) + TreeLeafSize(root->right));
	}
}

这样写有问题,因为无法处理空树或者某节点子树为空的情况。

正确的写法要加上对于空树的处理:

int TreeLeafSize(TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}

	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	else
	{
		return (TreeLeafSize(root->left) + TreeLeafSize(root->right));
	}
}

四、求二叉树的高度

依然要用递归的思路。一棵二叉树的高度等于它的左子树和右子树中高的那个子树的高度再加一。

int TreeHeight(TreeNode* root)
{
	if (root == NULL)
		return 0;
	int heightLeft = TreeHeight(root->left);
	int heightRight = TreeHeight(root->right);
	int higher = heightLeft;
	if (heightLeft < heightRight)
		higher = heightRight;
	return higher + 1;
}

五、单值二叉树判断

仍然用递归的思路进行判断。

首先,边界终止条件是遇到空节点直接返回true。

然后判断左右孩子是否冲突,如果左/右孩子存在且与根节点的值不同,则返回false。

最后,递归遍历左右子树,左右子树都返回true的时候返回true。第二种思路是遍历二叉树,把所有节点的值和固定值进行比较。

六、求二叉树第k层的节点个数

从根节点开始的第k层,相当于从第二层开始的第(k-1)层,相当于从第三层开始的第(k-

2)层......向下递归遍历,遇到空节点返回0,k=1时返回1。

int TreeLevelKSize(TreeNode* root, int k)
{
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	//子问题
	return TreeLevelKSize(root->left, k - 1) + TreeLevelKSize(root->right, k - 1);
}

七、查找二叉树值为x的节点

仍然递归遍历。找到了就把这个节点的指针返回给上一层,没找到就把空指针返回给上一层。

TreeNode* TreeFind(TreeNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;
	TreeNode* left = TreeFind(root->left, x);
	if (left)
		return left;
	return TreeFind(root->right, x);
}

八、判断两棵树是否相同

同时遍历两棵树来比较对应位置的节点:都是空节点返回true,一个为空一个不为空返回false,两者不为空但是值不相等返回false。

然后就递归遍历两棵树即可。

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL)
        return true;
    if(p == NULL || q == NULL)
        return false;
    if(p->val != q->val)
        return false;
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

判断对称二叉树的逻辑和半段二叉树相同的逻辑几乎完全一样,其实就是把根节点的左右子树看成两棵树,比较他们是否对称。

bool _isSymmetric(struct TreeNode* p, struct TreeNode* q)
{
    if (p == NULL && q == NULL)
        return true;
    if (p == NULL || q == NULL)
        return false;
    if (p->val != q->val)
        return false;
    return _isSymmetric(p->left,q->right) && _isSymmetric(p->right,q->left);
}

bool isSymmetric(struct TreeNode* root) {
    return _isSymmetric(root->left,root->right);
}

九、另一棵树的子树

思路是这样的:我们已经写过判断两棵树是否相等的算法,那么我们只需找出root的所有子树,和subroot比较一下是否相等。

递归的终止条件是遇到空节点(返回false)或者找到了对应的子树(返回true),然后递归遍历所有的节点就可以了。判断两棵树是否相等的代码直接复制粘贴。

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL)
        return true;
    if(p == NULL || q == NULL)
        return false;
    if(p->val != q->val)
        return false;
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if(root == NULL)
        return false;
    if(isSameTree(root,subRoot))
        return true;
    return(isSubtree(root->left, subRoot) || isSubtree(root->right,subRoot));
}

十、前序构建一棵树并按中序输出

前序构建二叉树时,依旧传一个指针来记录当前的数组下标。按照前序方式遍历即可。

中序遍历的代码可以直接复制粘贴,稍微修改一下。

typedef struct BinTreeNode
{
    struct BinTreeNode* left;
    struct BinTreeNode* right;
    char val;
}TreeNode;


TreeNode* CreateTree(char* a,int* pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }


    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->val = a[(*pi)++];
    root->left = CreateTree(a,pi);
    root->right = CreateTree(a,pi);

    return root;
}

void InOrder(TreeNode* root)
{
    if(root == NULL)
    {
        return;
    }
   
   InOrder(root->left);
   printf("%c ",root->val);
   InOrder(root->right);
}

int main() {
    char a[100];
    scanf("%s",a);
    int i = 0;
    TreeNode* root = CreateTree(a,&i);
    InOrder(root);
    return 0;
}

十一、二叉树的销毁

要用后序遍历,因为如果先销毁根节点,就找不到左右孩子了。

void TreeDestroy(TreeNode* root)
{
	if (root == NULL)
		return;
	TreeDestroy(root->left);
	TreeDestroy(root->right);
	free(root);
}

十二、层序遍历

层序遍历是广度优先遍历。

此处要用到之前学过的队列这种数据结构。根节点出队列,就带自己的两个子节点进入队列。这样恰好可以让所有节点按照层序出队列。

队列的实现在这篇文章里:队列的概念、C语言实现及应用-优快云博客

void TreeLevelOrder(TreeNode* root)
{
	Queue q;
	QueueInit(&q);
	if (root)
	{
		QueuePush(&q, root);
	}
	while (!QueueEmpty(&q))
	{
		TreeNode* front = QueueFront(&q);
		QueuePop(&q);

		printf("%d ", front->data);

		if (front->left)
			QueuePush(&q, front->left);
		if(front->right)
			QueuePush(&q, front->right);
	}
	QueueDestroy(&q);
}

此处可能会有疑问:为什么QueuePop之后还可以对front解引用?因为队列里存的是节点的地址而不是节点本身,pop之后节点依然存在。

十三、判断是否完全二叉树

这里要用层序遍历的思路。按照层序来遍历二叉树,空节点也进队列。当第一个空节点出队列时,如果队列中还有非空的节点,说明不是完全二叉树。如果没此时队列中没有非空节点了,那么一定是完全二叉树。

会不会出现这种情况:空节点出队列时,队列中全是空节点,但还有非空节点没有进队列?不会,因为后面的非空节点一定是前面的非空节点的孩子。

bool isCompleteTree(TreeNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		TreeNode* front = QueueFront(&q);
		QueuePop(&q);
		//第一个空节点出队列,开始判断
		if (front == NULL)
		{
			break;
		}
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
	}

	while (!QueueEmpty(&q))
	{
		TreeNode* front = QueueFront(&q);

		QueuePop(&q);
		if (front)
		{
			QueueDestroy(&q);
			return false;
		}
	}
	QueueDestroy(&q);
	return true;
}

十四、二叉树的性质

1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点.
2.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1.
3.对任何一棵二叉树,如果度为0其叶结点个数为n0,度为2的分支结点个数为n2,则有n0=n2+1

第三条性质这样理解:假设现在有这样一棵树,只有两个节点,n0为1,n2为0。

在此基础上开始增加节点。度为1的节点一定是由度为0的节点再连接一个节点变来的。所以,每增加一个度为1的节点,度为0的节点个数不变。然而,度为2的节点是由度为1的节点连接一个节点变来的。所以,增加一个度为2的节点,就一定会增加一个度为0的节点。n0和n2同步增长,保持n0=n2+1的关系。

4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2 (n+1)。(ps:log2 (n+1)是log以2为底,n+1为对数)

另外,有一种题目会给一棵二叉树的前序和中序,要求推出树的结构。这种题这样做:前序确定根,中序分隔左子树和右子树。

End

二叉树的创建及其基础操作 问题描述: 二叉树这部分的知识可谓是数据结构的重中之重,相关方面的知识点还是蛮多的,虽然有些知识点确实是难度颇高,但是其大部分的知识点还是能简单一些的,,所以在笔试面试中我们多多少少能遇见二叉树的相关题型,可以说二叉树以及其相关拓展的知识点玩儿6了,数据结构至少一半的知识已收入囊中了。 笔试面试中经常会遇到让你写出某个或某些二叉树中的成员函数,例如:节点的遍历顺序(前序,中序,后序,层序),怎 阅读详情

相关推荐

转录组PCA分析3大常见误区:数据标准化、离群样本与批次效应处理

本文深入探讨转录组PCA分析中的三大常见误区:数据标准化、离群样本识别与批次效应处理。通过实战案例和R代码演示,揭示如何优化PCA结果以提升生物学解释力,特别关注数据标准化策略的选择和批次校正方法的应用,帮助研究者避免常见陷阱并获得可靠的转录组分析结果。

weixin_28362173的博客 372

二叉树的基本操作

从根开始定义起,根为第1层,根的子节点为第2层,以此类推。:若一个节点含有子节点,则这个节点称为其子节点的父节点。:以某节点为根的子树中任一节点都称为该节点的子孙。:一个节点含有的子树的根节点称为该节点的子节点。:一个节点含有的子树的个数称为该节点的度。:具有相同父节点的节点互称为兄弟节点。:一棵树中,最大的节点的度称为树的度。:从根到该节点所经分支上的所有节点。:双亲在同一层的节点互为堂兄弟。:度为0的节点称为叶节点。非终端节点或分支节点。:树中节点的最大层次。

m0_63783532的博客 2043

搭建微信机器人的方案都在这了!

功能超级强大,虽不支持二次开发,但已有的功能足够个人使用,可惜官方作品已被腾讯告死,好在市面上还流落着不少破解版,有需要的自行搜索。可惜的是,微信官方已不准许新的微信号再使用 web 登录,这就直接从源头扼杀了 web 协议的微信机器人,虽说老的微信号还是能凑合着用,不过部分功能也受限。所以,这些都属于 PC 端的微信机器人。无论是 PC 端还是手机端,用 hook 方式实现的最大缺点就是要和某一个版本的微信客户端进行绑定,如果框架本身不对最新版本的微信适配,那使用的时候就无法升级到最新版本的微信。

weixin_47246330的博客 1万+

二叉树的基本操作(共21个)

简单介绍二叉树,并给出二叉树的21种基本操作

CXR_XC的博客 1万+

Qt OpenGL 3D 点云数据显示

在Qt中使用OpenGL显示3D点云数据是一个常见的需求,特别是在计算机视觉、机器人学和三维重建等领域。下面我将介绍一个基本的实现方案。

深之JohnChen的专栏 1236

VisionMaster -Group循环、数组数据格式化

这里创建一个格式化工具,按照自己想要的模式格式化刚刚输出的数据。因为是检测多个物体,所以这里选择输出的是数组。第一次的模板很不满意,反复调整参数也没好,边缘不整齐,强迫症患者受不了。实测如果输入设置太多,会导致模块失效,所以尽量选择需要的少量参数。这里要打开循环使能,循环数值就是高精度匹配的匹配个数。Group输出设置里选择刚刚建立的数据集。左边是主流程,右边是组合模块内部流程。修改采图这里的曝光值,图像提亮一点。建一个数据集,把想要的数据收集起来。用TCP助手测试一下OK。成功得到了想要的数据。

weixin_69505365的博客 4528

二叉树的构建

二叉树是一种非常重要的数据结构。本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历、中序遍历、后序遍历、层次遍历),二叉搜索树的构造等。

li123128的博客 3648

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 231

【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点

【数据结构】二叉树的基本操作大全,学会二叉树基本操作这一篇就够了:二叉树前序、中序、后序、层次遍历;求二叉树总结点个数,叶子结点个数,二叉树第k层的结点个数;求二叉树的高度;在二叉树中查找值为x的结点

2301_76606232的博客 6022

Xilinx FPGA ICAP原语实现多重配置

众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个FPGA固件呢?

whik1194的博客 4611

跨越边界:用MessagePipe实现无缝的进程间通信

MessagePipe是一个用于.NET平台的消息传递库,它专注于简化异步消息处理和进程间通信。通过提供一系列易于使用的API,开发者可以快速搭建起稳定可靠的通信管道,支持多种传输协议(如TCP、Unix域套接字等),并内置了序列化/反序列化功能,使得跨语言和跨平台的数据交换变得轻而易举。为了方便序列化和反序列化操作,我们需要为每种消息定义对应的类或结构体,并标记属性。这样可以确保消息在发送方和接收方之间正确无误地传递。[Key0set;[Key1set;

墨夶的博客 816

【数据结构】详解二叉树及其操作

二叉树要比以往其他的数据结构要来的更加抽象,当然努力功课这有挑战的一章也能够让你颇有成就感。

Become Mad的博客 1639

JavaScript实现量化交易策略(附完整源码)

JavaScript实现量化交易策略(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 720

二叉树的操作

题目链接http://dsalgo.openjudge.cn/binarytree/10/总时间限制:1000ms内存限制:65535kB描述 给定一棵二叉树,在二叉树上执行两个操作:1. 节点交换把二叉树的两个节点交换。 2. 前驱询问询问二叉树的一个节点对应的子树最左边的节点。 输入第一行输出一个整数t(t <= 100),代表测试数据的组数。对于每组测试...

weixin_30443075的博客 598

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

二叉树操作的总结

1.根据前序序列和中序序列创建二叉树 2.求二叉树中节点的个数 3.求二叉树中叶子节点的个数 4.求二叉树的高度 5.求二叉树的宽度 6.求二叉树第K层的节点个数 7.判断二叉树是否是完全二叉树 8.求二叉树中节点的最大距离 9.求二叉树中两个节点的最近公共祖先节点 10.输出一个二叉树的前序序列 11.输出一个二叉树的中序序列 12.输出一个二叉树的后序序列 13.输出一个二叉树的层次序列 14.左右子树互换 15.判断两棵树是否是相同 16.判断第二棵树是否是第一棵树的子树 17.合并两棵二叉树 18.

ALTLI的博客 508

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

二叉树的基础操作

None二叉树类型完美二叉树:完美二叉树所有层的节点都被完全填满。在完美二叉树中,叶节点的度为0,其余所有节点的度都为2;若树的高度为h,则节点总数为2h∗2−1,呈现标准的指数级关系,反映了自然界中常见的细胞分裂现象。完全二叉树:完全二叉树仅允许最底层的节点不完全填满,且最底层的节点必须从左至右依次连续填充。请注意,完美二叉树也是一棵完全二叉树。完满二叉树:完满二叉树除了叶节点之外,其余所有节点都有两个子节点。

2502_93780134的博客 1041

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

四、二叉树基本操作

有一个特殊的节点:根节点,根节点没有前驱节点。除根节点外,其余节点被分成 M(M > 0)个互不相交的集合,其中每一个集合又是一颗与树类似的子树。树是递归定义的。

kt_su的博客 641

二叉树的遍历及基本操作

        二叉树,顾名思义,是有每个结点有两个分支的树,我们将结点称为根节点,将它的两个分支称为它的左子树、右子树,所以我们用以下结构来定义二叉树的结构。typedef char TreeNodeType; typedef struct TreeNode//树的结点 { TreeNodeType data;//数据 struct TreeNode* lchild;//左子...

Lycorisradiata__的博客 2271

【Openjudge】二叉树的操作

题目太简单。知道二叉树长什么样就能做。用数组存二叉树。 #include using namespace std; struct _node{ int tag; int left; int right; _node(int n = 0){ tag = n; left = -1; right = -1; } _node& operator=(const _node& t

DreamChaserYx的专栏 1034

二叉树操作

简单整理二叉树相关实现,后续逐步补充完善便于随时查询。

进一步的专栏 345

二叉树基础操作总结

昨天的数据结构讲座,学长讲了二叉树这方面的知识,今天又复习了一下,赶紧记下来。 二叉树的定义 二叉树是n个结点的集合,可以为空,也可以由一个根结点和两棵互不相交的左,右子树组成。 二叉树的特点 1. 每个结点最多有两颗子树(是最多有)。 2. 左右子树有顺序,不能随意颠倒(哪怕其中那个结点只有一颗子树,也要区分是左子树还是右子树)。 现在让我们正式开始讲一下各种操作 先来看一张整体的效果图 ty...

qq_43646576的博客 581

二叉树_二叉树的定义及基础操作

二叉树:二叉树是n(n≥0)个结点的有限集合,二叉树的每个结点至多有两棵子树。二叉树的子树被称作左子树和右子树。 满二叉树:深度为k,且有2^k-1个节点的二叉树,这种树的特点是每一层上的节点数都是最大节点数。 完全二叉树:在一棵二叉树中,除最后一层外,其余层都是满的且最后一层或满、或是在右边缺少连续若干节点。 二叉树的性质: (1) 在非空二叉树中,第i层的结点总数不超过, i>=1...

Duc_Duke的博客 739

DS:二叉树链表操作

深刻地提出一个问题: 为什么上机课死活写不出来,课下只需一小时… 黑人问号????????????????,似乎还有期中上机?? 现总结一下这周的二叉树叭~ 课上连个层次创建都写不出来,真的不知道为啥 & 这周都在弄二叉树的链表操作 各层平均值 给定一个非空的二叉树,节点值为整型,设计程序计算该二叉树每层的节点值的平均值, 将各层均值放入一个序列输出 输入: 5 7 15 3 -1 -1 20 输出: 5 11...

Rachel_IS的博客 367
上一篇: 堆的概念、代码实现与应用
下一篇: 常见排序算法详解
jinyishu_
博客等级 码龄1年 53粉丝 82原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值