我们从两个方向讲解二叉树的前序遍历(递归+迭代)

一.递归

思想:

从根节点开始向其左孩子遍历每经过一个节点记录一下该节点的数值(只在第一次经过该节点时进行记录),当走到NULL时返回上一个节点,然后遍历其右孩子,如果右孩子存在记录其数值,再重复上面操作,如果不存在为NULL直接返回上一个节点再重复上面的操作.

代码如下:

void BTreePrevOrder(struct TreeNode* root,int* a,int* returnSize){//前序遍历if(NULL==root){//判出条件return;}a[(*returnSize)++]=root->val;BTreePrevOrder(root->left,a,returnSize);BTreePrevOrder(root->right,a,returnSize);
}

具体运行过程:(如图)

二.迭代

思想:

首先我们要知道递归的过程就是一个入栈和出栈的过程,所以我们可以使用迭代来模仿这个入栈和出栈的过程从而实现二叉树的前序遍历,首先判断该二叉树是否为空是空直接返回,不是空则进行前序遍历,将根节点入栈,一直将栈首元素的数值记录然后再将其左孩子入栈,当某个时刻栈首元素为空时,进入循环先将该空的节点出栈,然后记录新的栈首元素后将其出栈,此时的栈首元素为其上一层元素,方便其返回上一层,然后将记录的节点的右孩子入栈,为空继续循环,不为空退出循环重复上述操作.(具体过程看下图)

代码如下:

​
typedef struct TreeNode BTNode;typedef struct Stack{//构建栈的结构体BTNode* root_a[100];//存二叉树的节点的数组int size;//表示存储个数
}Stack;void PushStack(Stack* b,BTNode* root){//入栈b->root_a[b->size++]=root;
}void PopStack(Stack* b){//出栈b->size--;
}int* preorderTraversal(struct TreeNode* root, int* returnSize){int* a=(int*)malloc(sizeof(int)*100);//创建数组用来存储二叉树前序遍历的值if(NULL==a){printf("申请节点失败!\n");return NULL;}Stack b;//创建栈BTNode* pop_temp;//用来记录将要出栈的节点b.size=0;int i=0;PushStack(&b,root);//先把根节点入栈while(NULL != b.root_a[b.size-1]){a[i++]=b.root_a[b.size-1]->val;//第一次访问该节点时记录其值PushStack(&b,b.root_a[b.size-1]->left);//将该节点的左孩子入栈如果为NULL进入下一个
//循环while(NULL == b.root_a[b.size-1]){PopStack(&b);//先把这个为NULL的节点出栈if(0==b.size){//如果栈为空则遍历结束退出循环(*returnSize)=i;return a;                }pop_temp=b.root_a[b.size-1];//记录上一个节点PopStack(&b);//将其出栈,使其返回时可以直接进入上一层的节点PushStack(&b,pop_temp->right);//将该节点的右孩子入栈}}(*returnSize)=i;return a;
}​

具体运行过程:(如图)

二叉树的前序遍历(C语言)相关推荐

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

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

  2. 先根遍历二叉树c语言程序,二叉树先序遍历C语言实现

    二叉树先序遍历C语言实现 二叉树先序遍历的实现思想是: 访问根节点: 访问当前节点的左子树: 若当前节点无左子树,则访问当前节点的右子树: 以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为: 访 ...

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

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

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

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

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

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

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

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

  7. LeetCode-二叉树-144. 二叉树的前序遍历

    描述 144. 二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:roo ...

  8. [leetcode] 144. 二叉树的前序遍历

    144. 二叉树的前序遍历 递归写法 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List ...

  9. python非递归前序遍历二叉树_LintCode66:二叉树的前序遍历(python)

    66. 二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 样例 1: 输入:{1,2,3} 输出:[1,2,3] 解释: 1 / \ 2 3 它将被序列化为{1,2,3} 前序遍历 样 ...

最新文章

  1. EF Code First执行SQL语句及存储过程
  2. 关于 spring-aop理解
  3. oracle rac 图形化界面,oracle 10g rac配置vipca进不了图形界面,请高手帮忙分析下
  4. 【PAT乙级】1019 数字黑洞 (20 分)
  5. CSS3制作一个简单的进度条
  6. 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?
  7. 如何在程序中不用加号实现加法_程序员那些事 | JavaScript基础(六)
  8. laravel5.4 刷新过快,出现The only supported ciphers are AES-128-CBC and AES-256-CBC
  9. nagios 安装步骤-1
  10. kafka redis vs 发布订阅_发布订阅的消息系统 Kafka的深度解析
  11. Docker框架的使用系列教程(一)
  12. 【实验】修改数据文件名字的三种途径
  13. tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
  14. C语言编程初体验 作文,我的理想是当编程师作文
  15. Ubuntu 修改 谷歌输入法 简繁体切换的快捷键
  16. Windows重装Ubuntu 20.04单系统
  17. 设计模式的原则和分类 思想模型
  18. 熊克斐:技术夜未眠 从码畜到CTO
  19. 丘成桐女子中学生数学竞赛结果出炉,人大附中拿下金奖,上海4人入围
  20. constant api app

热门文章

  1. 在阿里实习后,他的感悟
  2. 无法解析该计算机名称,敬业签电脑版软件提示“未能解析此远程名称”如何解决?...
  3. 从《剑与家园》中学习战斗策略设计
  4. 三星玄龙骑士电竞显示器Neo G9: 全面提升游戏体验的电竞显示器
  5. 王者荣耀账号转服务器,《王者荣耀》账号怎么转区 账号转区方法
  6. 矩阵旋转公式备忘(左手坐标系和右手坐标系)
  7. Mybatis的循环引用
  8. 带checkbox的listView 实现多选,全选,反选
  9. 在Rabbitmq管理台发送消息
  10. idea常用快捷键与注意事项