• 前序遍历:首先访问根节点,然后遍历左子树,最后遍历右子树(根->左->右)
前序遍历的递归算法

思路:

  1. 访问根节点
  2. 遍历左子树
  3. 遍历右子树

代码如下:

//二叉树的前序遍历(递归)
void BinaryTreePrevOrder(BTNode* root){if (root){putchar(root->data);BinaryTreePrevOrder(root->lChild);BinaryTreePrevOrder(root->rChild);}
}
前序遍历的非递归算法

思路:

借助栈来实现

  1. 传入二叉树根节点
  2. 打印当前节点(如果该节点有右孩子就将右孩子入栈)
  3. 如果该节点有左孩子则访问,如果没有,就访问栈顶(返回步骤2,直至栈空)

图解非递归:

代码如下:

//二叉树的前序遍历(递归)
void BinaryTreePrevOrderNonR(BTNode* root)
{Stack st;BTNode * cur = root; //从根开始StackInit(&st, 100);//不能用栈是否为空进行判断(根节点的左边全部遍历结束,访问根节点的右孩子时,此时栈为空)while (cur){putchar(cur->data); //访问当前节点if (cur->rChild) //如果有右孩子,右孩子入栈{StackPush(&st, cur->rChild);}if (cur->lChild) //如果有左孩子,访问左孩子{cur = cur->lChild;}else //没有左孩子就取栈顶{cur = StackTop(&st); //取到空时,遍历结束,循环跳出StackPop(&st);}}StackDestory(&st);
}

栈函数实现如下:

typedef char BTDataType;
// 二叉链的结构体
typedef struct BinaryTreeNode {BTDataType data;         // 当前节点值域struct BinTreeNode* lChild;    // 指向当前节点左孩子 struct BinTreeNode* rChild;// 指向当前节点右孩子
}BTNode;typedef BTNode* StDataType;
// 栈的结构体
typedef struct Stack {StDataType* array;    // 指向动态开辟的数组size_t size;        // 有效数据个数size_t capicity;   // 容量空间的大小
}Stack;void StackInit(Stack* psl, size_t capicity)
{assert(psl);psl->capicity = capicity;psl->array = (StDataType *)malloc(capicity * sizeof(StDataType));assert(psl->array);psl->size = 0;
}void StackDestory(Stack* psl)
{assert(psl);if (psl->array){free(psl->array);psl->array = NULL;psl->size = 0;psl->capicity = 0;}
}void CheckCapacity(Stack* psl)
{assert(psl);if (psl->size == psl->capicity){psl->capicity *= 2;psl->array = (StDataType *)realloc(psl->array, psl->capicity * sizeof(StDataType));}
}void StackPush(Stack* psl, StDataType x)
{assert(psl);CheckCapacity(psl);psl->array[psl->size] = x;psl->size++;
}void StackPop(Stack* psl)
{assert(psl || psl->size);psl->size--;
}StDataType StackTop(Stack* psl)
{if (StackIsEmpty(psl)){return (StDataType)0;}return psl->array[psl->size - 1];
}int StackIsEmpty(Stack* psl)
{return psl->size == 0;
}

详解二叉树的前序遍历相关推荐

  1. 【C++】二叉树之力扣经典题目1——详解二叉树的递归遍历,二叉树的层次遍历

    如有错误,欢迎指正. 如有不理解的地方,可以私信问我. 文章目录 题目1:根据二叉树创建字符串 题目 实例 思路与解析 代码实现 题目2:二叉树的层序遍历 题目 思路与解析 代码实现 题目1:根据二叉 ...

  2. 二叉树的前序遍历,中序遍历,后序遍历-详解-配套例题

    二叉树作为数据结构中一种简单而且重要的数据结构,他的存储结构和算法都相对比较简单,因此他也显得特别重要,因为很多问题都可以抽象为二叉树的问题. 在这里我们对于二叉树的基本概念不做详细介绍,我们这里主要 ...

  3. 一文详解:二叉树之前序遍历、中序遍历、后序遍历

    今天是端午节,祝大家端午节快乐,端午安康!~ 二叉树顾名思义是一个只有两个结点的树,分为left结点和right结点.今天我们就来对二叉树的遍历方式进行一个总结回顾. 二叉树是由一个个结点构成的,那么 ...

  4. 详解二叉树的三种遍历方式(递归、迭代、Morris算法)

    详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...

  5. LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium

    题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: 1 struct TreeNode { 2 int val; 3 TreeNode* ...

  6. 根据二叉树的前序遍历和中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  7. 刻意练习:LeetCode实战 -- 二叉树的前序遍历

    背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历.中序遍历.后序遍历以及层次遍历,而LeetCode也有二叉树的 ...

  8. python根据二叉树的前序遍历和中序遍结果历重建二叉树

    python根据二叉树的前序遍历和中序遍结果历重建二叉树 前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: ( ...

  9. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)

    经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...

最新文章

  1. pandas.Series.values 将Series内的数值以ndarray或ndarray-like的形式返回,取决于原Seires的数据类型
  2. 网站性能优化思维导图
  3. [SCOI2010]生成字符串
  4. python创建空文本文件_Python干货:「文件处理整合」 创建、打开、写入和删除...
  5. LOJ:出纳员问题(差分约束)
  6. python中扑克牌类设计_python中的图像界面设计(二)
  7. PHP三种字符串界定符的区别
  8. python利用Excel读取和存储测试数据完成接口自动化
  9. Mac下的Homebrew安装与使用
  10. LabVIEW中调用Halcon
  11. 记一次网易云解锁灰色音乐代理异常
  12. iOS富文本添加下划线和颜色
  13. 下列各命令中可以在计算机屏幕上,下列各命令中,可以在计算机屏幕上放映演示文稿的是()。...
  14. 网络原创文章版权维护的辅助好工具copycheck抄袭检测软件
  15. html代码简单的保护环境网页代码 学生环保主题网页制作代码 简单的垃圾分类网页制作作业 简单的环境保护网页制作源码
  16. [数据科学]000.我为什么当数据科学家
  17. 零基础学java——面向对象(三)
  18. php四则运算出题器_php 四则运算
  19. linux中convert用法
  20. HNUST OJ 1883 神奇的序列

热门文章

  1. Pytorch1.1.0 入门 自定义op(python)
  2. From Microservices to Data Microservices-pivotal-专题视频课程
  3. selenium 校园网自动连接
  4. vivado+vscode
  5. linux 8g内存只认4g,为什么8g运行内存只有4g可用
  6. BERT预训练模型的使用
  7. EtherCAT IGH 命令行介绍
  8. 【实例】使用jquery自带的slideToggle由上到下缓缓加载图片
  9. 六十星系之43紫微天相坐辰戌
  10. 汉诺塔问题(Hanoi塔)