leadcode的Hot100系列--二叉树创建和遍历
很多题目涉及到二叉树,所以先把二叉树的一些基本的创建和遍历写一下,方便之后的本地代码调试。
为了方便,这里使用的数据为char类型数值,初始化数据使用一个数组。
因为这些东西比较简单,这里就不做过多详述。
创建
1、定义一些内容:
// 二叉树节点结构体
typedef struct tree_node
{
struct tree_node *pL;
struct tree_node *pR;
char data;
}TREE_NODE_S
// 输入数据的无效值,若读到无效值,则说明该节点为空
#define INVALID -1
// 全局变量,记录当前输入的数组位置
char count = 0
// 在遍历树的时候,需要对data做的操作
typedef void (*pfprocData)(char *p);
2、使用递归方式创建原始二叉树。
其基本思想与先序遍历基本一样,只不过一个是对数据做输出,一个是对数据做输入。
TREE_NODE_S* createNode(char *str)
{
TREE_NODE_S *pTemp = NULL;
char data = *(str+count);
count ++;
if (data != INVALID)
{
pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S));
if (NULL == pTemp)
{
return pTemp;
}
pTemp->data = data;
pTemp->pL = createNode(str);
pTemp->pR = createNode(str);
}
return pTemp;
}
3、这里再提供一种无返回值、传树的二级指针的创建方法:
createNode2(TREE_NODE_S **p, char *str)
{
TREE_NODE_S *pTemp = NULL;
char data = *(str+count);
count ++;
if (data != INVALID)
{
pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S));
if (NULL == pTemp)
{
*p = NULL;
return;
}
// 这里直接对指针进行赋值
*p = pTemp;
pTemp->data = data;
createNode2(&(pTemp->pL), str);
createNode2(&(pTemp->pR), str);
}
else
{
*p = NULL;
}
return;
}
遍历
三种常见的前序、中序、后序遍历:
// 这里pfprocData,是用来处理结构体里面的数据部分的函数
void frontOrder(TREE_NODE_S *p, pfprocData pfunc)
{
if (NULL == p)
{
return;
}
pfunc(&(p->data));
frontOrder(p->pL, pfunc);
frontOrder(p->pR, pfunc);
return;
}
void middleOrder(TREE_NODE_S *p, pfprocData pfunc)
{
if (NULL == p)
{
return;
}
middleOrder(p->pL, pfunc);
pfunc(&(p->data));
middleOrder(p->pR, pfunc);
return;
}
void lastOrder(TREE_NODE_S *p, pfprocData pfunc)
{
if (NULL == p)
{
return;
}
lastOrder(p->pL, pfunc);
lastOrder(p->pR, pfunc);
pfunc(&(p->data));
return;
}
测试
// 先创建出如下两种树,然后做遍历输出
// 1
// / \
// 2 4
// \
// 3
char ps1[] = {1, 2, INVALID, 3, INVALID, INVALID, 4, INVALID, INVALID};
// 1
// / \
// 2 6
// / \ \
// 3 5 7
// \
// 4
char ps2[] = {1, 2, 3, INVALID, 4, INVALID, INVALID, 5, INVALID, INVALID, 6, INVALID, 7, INVALID, INVALID};
// 这里只对节点数据进行打印
void procData(char *p)
{
printf("%u ", *p);
}
int main(void)
{
TREE_NODE_S *pstTreeHead1 = NULL;
TREE_NODE_S *pstTreeHead2 = NULL;
pstTreeHead1 = createTree2(ps1);
pstTreeHead2 = createTree2(ps2)
// 如果使用第二个创建方法,则:
// createTree(&pstTreeHead1, ps1);
// createTree(&pstTreeHead2, ps2);
printf("%-14s", "frontOrder:");
frontOrder(pstTreeHead1, procData);
printf("\n");
printf("%-14s", "frontOrder:");
frontOrder(pstTreeHead2, procData);
printf("\n");
printf("%-14s", "middleOrder:");
middleOrder(pstTreeHead2, procData);
printf("\n");
printf("%-14s", "lastOrder:");
lastOrder(pstTreeHead2, procData);
printf("\n");
}
leadcode的Hot100系列--二叉树创建和遍历的更多相关文章
- leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用
提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...
- leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划
如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...
- leadcode的Hot100系列--226. 翻转二叉树
这玩意儿基本上还是遍历的那一套, 这里使用先序遍历的方式,直接对左右子树进行对调即可. (虽然看题目的时候,感觉都一样,但真正写出来之后,印象还是深刻了很多) struct TreeNode* inv ...
- leadcode的Hot100系列--617. 合并二叉树
合并,就是两个树的结构交集部分,数据相加,否则,取非空部分. 所以,这里相当于是对两棵树同时遍历: 如果两棵树节点都不为空,则数据相加, 否则,直接指针把不为空的节点复制过来. 注:这里没有申请内存, ...
- leadcode的Hot100系列--104. 二叉树的最大深度
依然使用递归思想. 思路: 1.树的深度 = max (左子树深度,右子树深度)+ 1 . ------> 这里的加1是表示自己节点深度为1. 2.如果当前节点为null,则说明它的左右子树深度 ...
- leadcode的Hot100系列--155. 最小栈
栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...
- Python -二叉树 创建与遍历算法(很详细)
树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...
- leadcode的Hot100系列--78. 子集--回溯
上一篇说了使用位运算来进行子集输出,这里使用回溯的方法来进行排序. 回溯的思想,我的理解就是: 把解的所有情况转换为树或者图,然后用深度优先的原则来对所有的情况进行遍历解析. 当然,因为问题中会包涵这 ...
- leadcode的Hot100系列--78. 子集--位运算
看一个数组的子集有多少,其实就是排列组合, 比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种. 一般对应有两种方法:位运算 和 回溯. 这里先使用位运算来做. 位运算 一个长度 ...
随机推荐
- OpenSSL RSA加解密 (.Net公钥加密/ Linux端私钥解密)
要求在.Net端生成公钥私钥对. 然后在.Net端使用RSA公钥加密:在Linux端使用RSA私钥解密. 最初的尝试是:.Net端使用RSACryptoServiceProvider; linux端使 ...
- Emgu-WPF 激光雷达研究-定位实现
原文:Emgu-WPF 激光雷达研究-定位实现 特定位置或障碍物位置定位实现. 读取激光雷达数据并存储于本地作为测试数据.每一帧数据对同一障碍物的定位信息均存在偏差.所以先对需要定位的点进行数据取样. ...
- Wpf发送接收 win32消息
#region WPF发送和接收win32消息 public const int WM_GETTEXT = 0x0D; public const int WM_SETTEXT = 0x0C; publ ...
- Android零基础入门第60节:日历视图CalendarView和定时器Chronometer
原文:Android零基础入门第60节:日历视图CalendarView和定时器Chronometer 上一期学习了AnalogClock.DigitalClock和TextClock时钟组件,本期继 ...
- [转] Protobuf高效结构化数据存储格式
从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么? Goo ...
- “真正的工作不是说的天花乱坠”,Torvalds 说, “而是在于细节”(Torvalds 认为成功的项目都是99%的汗水和1%的创新)
在刚刚结束的加利福尼亚州的开源领袖峰会(2月14日-16日)上,Linus Torvalds 接受了外媒的采访,分享了他如何管理 Linux kernel 的开发以及他对工作的态度. “真正的工作不是 ...
- 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)
作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...
- Access Violation分成两大类:运行期和设计期(很全的解释)
用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因 在启动或关闭Delphi IDE以 ...
- Linux正则和grep命令
设置命令的默认参数和别名 每次都要输入 ls -l ,烦不烦,我想用 ll 来表示 ls -l, 可以,只要在 ~/.bashrc 中加上 alias ll='ls -l' ,然后运行 source ...
- C++中的new,operator new与placement new
以下是C++中的new,operator new与placement new进行了详细的说明介绍,需要的朋友可以过来参考下 new operator/delete operator就是new和 ...