很多题目涉及到二叉树,所以先把二叉树的一些基本的创建和遍历写一下,方便之后的本地代码调试。

为了方便,这里使用的数据为char类型数值,初始化数据使用一个数组。

因为这些东西比较简单,这里就不做过多详述。


创建

1、定义一些内容:

  1. // 二叉树节点结构体
  2. typedef struct tree_node
  3. {
  4. struct tree_node *pL;
  5. struct tree_node *pR;
  6. char data;
  7. }TREE_NODE_S
  8. // 输入数据的无效值,若读到无效值,则说明该节点为空
  9. #define INVALID -1
  10. // 全局变量,记录当前输入的数组位置
  11. char count = 0
  12. // 在遍历树的时候,需要对data做的操作
  13. typedef void (*pfprocData)(char *p);

2、使用递归方式创建原始二叉树。

其基本思想与先序遍历基本一样,只不过一个是对数据做输出,一个是对数据做输入。

  1. TREE_NODE_S* createNode(char *str)
  2. {
  3. TREE_NODE_S *pTemp = NULL;
  4. char data = *(str+count);
  5. count ++;
  6. if (data != INVALID)
  7. {
  8. pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S));
  9. if (NULL == pTemp)
  10. {
  11. return pTemp;
  12. }
  13. pTemp->data = data;
  14. pTemp->pL = createNode(str);
  15. pTemp->pR = createNode(str);
  16. }
  17. return pTemp;
  18. }

3、这里再提供一种无返回值、传树的二级指针的创建方法:

  1. createNode2(TREE_NODE_S **p, char *str)
  2. {
  3. TREE_NODE_S *pTemp = NULL;
  4. char data = *(str+count);
  5. count ++;
  6. if (data != INVALID)
  7. {
  8. pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S));
  9. if (NULL == pTemp)
  10. {
  11. *p = NULL;
  12. return;
  13. }
  14. // 这里直接对指针进行赋值
  15. *p = pTemp;
  16. pTemp->data = data;
  17. createNode2(&(pTemp->pL), str);
  18. createNode2(&(pTemp->pR), str);
  19. }
  20. else
  21. {
  22. *p = NULL;
  23. }
  24. return;
  25. }

遍历

三种常见的前序、中序、后序遍历:

  1. // 这里pfprocData,是用来处理结构体里面的数据部分的函数
  2. void frontOrder(TREE_NODE_S *p, pfprocData pfunc)
  3. {
  4. if (NULL == p)
  5. {
  6. return;
  7. }
  8. pfunc(&(p->data));
  9. frontOrder(p->pL, pfunc);
  10. frontOrder(p->pR, pfunc);
  11. return;
  12. }
  13. void middleOrder(TREE_NODE_S *p, pfprocData pfunc)
  14. {
  15. if (NULL == p)
  16. {
  17. return;
  18. }
  19. middleOrder(p->pL, pfunc);
  20. pfunc(&(p->data));
  21. middleOrder(p->pR, pfunc);
  22. return;
  23. }
  24. void lastOrder(TREE_NODE_S *p, pfprocData pfunc)
  25. {
  26. if (NULL == p)
  27. {
  28. return;
  29. }
  30. lastOrder(p->pL, pfunc);
  31. lastOrder(p->pR, pfunc);
  32. pfunc(&(p->data));
  33. return;
  34. }

测试

  1. // 先创建出如下两种树,然后做遍历输出
  2. // 1
  3. // / \
  4. // 2 4
  5. // \
  6. // 3
  7. char ps1[] = {1, 2, INVALID, 3, INVALID, INVALID, 4, INVALID, INVALID};
  8. // 1
  9. // / \
  10. // 2 6
  11. // / \ \
  12. // 3 5 7
  13. // \
  14. // 4
  15. char ps2[] = {1, 2, 3, INVALID, 4, INVALID, INVALID, 5, INVALID, INVALID, 6, INVALID, 7, INVALID, INVALID};
  16. // 这里只对节点数据进行打印
  17. void procData(char *p)
  18. {
  19. printf("%u ", *p);
  20. }
  21. int main(void)
  22. {
  23. TREE_NODE_S *pstTreeHead1 = NULL;
  24. TREE_NODE_S *pstTreeHead2 = NULL;
  25. pstTreeHead1 = createTree2(ps1);
  26. pstTreeHead2 = createTree2(ps2)
  27. // 如果使用第二个创建方法,则:
  28. // createTree(&pstTreeHead1, ps1);
  29. // createTree(&pstTreeHead2, ps2);
  30. printf("%-14s", "frontOrder:");
  31. frontOrder(pstTreeHead1, procData);
  32. printf("\n");
  33. printf("%-14s", "frontOrder:");
  34. frontOrder(pstTreeHead2, procData);
  35. printf("\n");
  36. printf("%-14s", "middleOrder:");
  37. middleOrder(pstTreeHead2, procData);
  38. printf("\n");
  39. printf("%-14s", "lastOrder:");
  40. lastOrder(pstTreeHead2, procData);
  41. printf("\n");
  42. }

leadcode的Hot100系列--二叉树创建和遍历的更多相关文章

  1. leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用

    提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...

  2. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  3. leadcode的Hot100系列--226. 翻转二叉树

    这玩意儿基本上还是遍历的那一套, 这里使用先序遍历的方式,直接对左右子树进行对调即可. (虽然看题目的时候,感觉都一样,但真正写出来之后,印象还是深刻了很多) struct TreeNode* inv ...

  4. leadcode的Hot100系列--617. 合并二叉树

    合并,就是两个树的结构交集部分,数据相加,否则,取非空部分. 所以,这里相当于是对两棵树同时遍历: 如果两棵树节点都不为空,则数据相加, 否则,直接指针把不为空的节点复制过来. 注:这里没有申请内存, ...

  5. leadcode的Hot100系列--104. 二叉树的最大深度

    依然使用递归思想. 思路: 1.树的深度 = max (左子树深度,右子树深度)+ 1 . ------> 这里的加1是表示自己节点深度为1. 2.如果当前节点为null,则说明它的左右子树深度 ...

  6. leadcode的Hot100系列--155. 最小栈

    栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...

  7. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

  8. leadcode的Hot100系列--78. 子集--回溯

    上一篇说了使用位运算来进行子集输出,这里使用回溯的方法来进行排序. 回溯的思想,我的理解就是: 把解的所有情况转换为树或者图,然后用深度优先的原则来对所有的情况进行遍历解析. 当然,因为问题中会包涵这 ...

  9. leadcode的Hot100系列--78. 子集--位运算

    看一个数组的子集有多少,其实就是排列组合, 比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种. 一般对应有两种方法:位运算 和 回溯. 这里先使用位运算来做. 位运算 一个长度 ...

随机推荐

  1. Hibernate_12_HQL句子

    使用HQL查询功能: (1)与SQL相似,SQL用. (2)SQL查询的是表和表中的列.HQL查询的是对象与对象中的属 (3)HQL的keyword不区分大写和小写,类名与属性名是区分大写和小写 (4 ...

  2. ef core 数据类型 && 表字段名设置

    HasColumnType HasColumnType是指定字段类型 [Column(TypeName = "decimal(18, 2)")] public decimal Mo ...

  3. 【std::regex】C++文件路径正则表达式

    今天代码中遇到使用正则表达式匹配一个文件路径的问题,需要验证传入的文件路径是否合法,学习了简单的正则表达式的写法后,简单写了如下代码,在网上找了一些在线测试正则表达式的网站,测试可以通过. std:: ...

  4. QT在release版本产生pdb文件

    ##环境说明 QtCreator QtLibrary 编译器 Qt Creator 2.7.0 4.8.4-msvc msvc9.0(VS2008) ##背景说明 >项目中需要对发布版本追踪崩溃 ...

  5. 毕设(二)C#SerialPort

    毕业设计中,用到串口与无人机通信,所以就用到了SerialPort这个类,这个类在设置属性时, 用到最主要的属性应该是COM口和波特率,由于本人不熟悉硬件,不便多说,但经验告诉我是这样的, 还有数据位 ...

  6. Ptypes一个开源轻量级的c++库,包括对一些I/O操作、网络通信、多线程和异常处理的封装

    C++开源项目入门级:Ptypes    Ptypes一个开源轻量级的c++库,包括对一些I/O操作.网络通信.多线程和异常处理的封装.虽然代码有限,包括的内容不少,麻雀虽小,五脏俱全.    提高: ...

  7. 用 eric6 与 PyQt5 实现python的极速GUI编程(35篇PyQT和200多篇Python)

    [题记] 我是一个菜鸟,这个系列是我的学习笔记. PyQt5 出来有一段时间了, PyQt5 较之 PyQt4 有一些变化,而网上流传的几乎都是 PyQt4 的教程,照搬的话大多会出错. eric6 ...

  8. Qt发展历史及其特点简介(没有哪一种方案能够独霸Windows)

    Qt 是一个跨平台的C++应用程序框架,支持Windows.Linux.Mac OS X.Android.iOS.Windows Phone.嵌入式系统等.也就是说,Qt 可以同时支持桌面应用程序开发 ...

  9. oh my god,写20万数据到Excel只需9秒

    还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到 ...

  10. Tuxera NTFS 2018 for Mac中文破解版 U盘读写软件-让你的Mac支持NTFS

    下载链接(复制到浏览器下载):http://h5ip.cn/TLMc 软件介绍 给大家带来一款苹果Mac上如何使用U盘读写的软件,Tuxera NTFS 2018 for Mac中文破解版,Mac O ...