当前位置:   article > 正文

leetcode的Hot100系列--二叉树创建和遍历

pfprocdata

很多题目涉及到二叉树,所以先把二叉树的一些基本的创建和遍历写一下,方便之后的本地代码调试。
为了方便,这里使用的数据为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. }

转载于:https://www.cnblogs.com/payapa/p/11109446.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/598602
推荐阅读
相关标签
  

闽ICP备14008679号