力扣解题之树的先中后序

学习笔记

目录

一、树的先中后序
1.基本操作
2.力扣解题

树的先中后序

1.基本操作

#include<stdio.h>
#include<stdlib.h>

//结构体变量定义
typedef char BTDataType;
typedef struct BinaryTreeNode{
	struct BinaryTreeNode* left;//左节点
	struct BinaryTreeNode* right;//右节点
	BTDataType data;//节点指针指向的数据
}BTNode;

//先序方法,主函数中实现函数调用
void PrevOrder(BTNode* root)
{
	//判断根节点是否为空,为空则返回函数迭代的上一层进行重新迭代
	if (root == NULL){
		printf("NULL ");
		return;
	}
	//进行先序遍历排序,先输出根节点再左节点最后右节点,迭代过程
	printf("%c ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

//中序,先左再根后右
void InOrder(BTNode* root){
	if (root == NULL){
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%c ", root->data);
	InOrder(root->right);
}

//后序,先左再右后根
void PostOrder(BTNode* root){
	if (root == NULL){
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);	
	printf("%c ", root->data);
}

2.力扣解题

  • 前序

    通过观察我们发现本题的求解前序无法直接用基本操作实现,基本操作的返回结果是打印输出每个结点的值,但此题却需要我们将结点值存放于一个数组中,并将结果进行返回。
    在这里插入图片描述
    步骤:
    1.根据提示要用malloc动态分配一个数组,防止静态数组造成空间过大或不足的现象。
    注:在定义数组大小时,C相对C++与java功能更弱一些,没有数据结构,无法利用vector实现数组空间地址的动态改变(不够会自动增容)。
    分配数组空间大小方法:
    (1)盲开:容易造成数组空间过大或过小的现象。
    (2)利用求树的结点数确定数组空间大小。
    2.调用先序方法递归实现先序遍历
    注意:
    (1)可以单独创建一个子函数的方法,实现先序遍历的调用,因为如果直接在原方法中调用,会多次重复执行malloc方法。
    (2)C与C++中数组多值返回变量名只返回一值,因此若想实现多值返回只有2种方法:
    ①通过结构体返回,结构体里一指针指向数组的指针。
    ②利用returnSize——输出型参数,前者为输入型参数。
    输入型参数:别人将参数传过来给你用。
    输出型参数:从输出型参数这给你一个值,但你改变了之后我就拿不到(要用指针)。

方法一:
在这里插入图片描述
方法二:
对i不设置其地址形式,而将其直接设为全局变量,但为了防止一个全局变量在不同的子树中出现重复调用的问题,要在子树每次进行先序遍历前将i的值赋值为0。
在这里插入图片描述
同理有:

  • 中序
    在这里插入图片描述
  • 后序
  • 在这里插入图片描述
    个人觉得看懂解释就能理解树的前中后序辣
    纯纯学习笔记,如果能帮助大家理解学到知识的话也算我的荣幸呀~
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值