1. 题目

2. 解答

2.1. 递归法

定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么

    1. 将当前节点的数值加入到 data 中
    1. 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去
    1. 递归得到其右子树的数据向量 temp,将 temp 合并到 data 中去
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:vector<int> preorderTraversal(TreeNode* root) {vector<int> data = {};vector<int> temp = {};if (root != NULL){data.push_back(root->val);temp = preorderTraversal(root->left);data.insert(data.end(),temp.begin(),temp.end());temp = preorderTraversal(root->right);data.insert(data.end(),temp.begin(),temp.end());}return data;         }
};
复制代码
2.2. 迭代法

定义一个存放树中节点的栈 node_stack 和存放数据的向量 data,从根节点开始,如果节点不为空或者栈非空,循环以下过程:

    1. 如果节点非空,将节点的值加入 data,如果节点有右孩子,将节点右孩子压入栈,节点指向其左孩子,循环直到节点为空
    1. 如果节点为空,栈非空,则弹出栈顶节点
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:vector<int> preorderTraversal(TreeNode* root) {vector<int> data = {};stack<TreeNode*> node_stack;TreeNode* temp = root;while (temp || !node_stack.empty()){while(temp != NULL){data.push_back(temp->val);if (temp->right)    node_stack.push(temp->right);temp = temp->left;}// 若最后一个节点没有右子节点,栈为空if (!node_stack.empty()) // 栈非空{temp = node_stack.top();node_stack.pop();}}return data; }
};
复制代码
2.3. Morris 遍历法

前面两种方法要么需要函数栈要么需要人工栈,其空间复杂度为 ,而 Morris 遍历法可以做到在不影响时间复杂度的情况下做到空间复杂度为

定义一个存放数据的向量 data,从根节点开始,如果当前节点非空,循环以下过程:

    1. 如果当前节点没有左孩子,将当前节点的值加入到 data 中,当前节点指向其右孩子
    1. 如果当前节点有左孩子,则寻找当前节点的前驱节点,即节点值小于该节点值并且值最大的节点,也即当前节点左子树中值最大的节点
    • a) 如果前驱节点没有右孩子,前驱节点右孩子指向当前节点,将当前节点的值加入到 data 中,当前节点指向其左孩子
    • b) 如果前驱节点右孩子为当前节点,当前节点指向其右孩子,前驱节点右孩子设为空(恢复原有树结构)
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {public:vector<int> preorderTraversal(TreeNode* root) {vector<int> data = {};TreeNode* cur = root;TreeNode* pre = NULL;while (cur){if (cur->left == NULL){data.push_back(cur->val);cur = cur->right;}else{// 寻找前驱结点pre = cur->left;while (pre->right != cur && pre->right){pre = pre->right;}if (pre->right == NULL){data.push_back(cur->val);pre->right = cur;cur = cur->left;}else{cur = cur->right;pre->right = NULL;}}}return data;}
};
复制代码

参考资料

获取更多精彩,请关注「seniusen」!

LeetCode 144 ——二叉树的前序遍历相关推荐

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

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

  2. LeetCode 144. 二叉树的前序遍历(前序遍历)

    文章目录 1. 题目信息 2. 解题 2.1 递归 2.2 循环,必须掌握 1. 题目信息 给定一个二叉树,返回它的 前序 遍历. 示例:输入: [1,null,2,3] 1\2/3 输出: [1,2 ...

  3. Leetcode 144. 二叉树的前序遍历 (每日一题 20210820)

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

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

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

  5. LeetCode 144. 二叉树的前序遍历(递归)(迭代)(颜色标记法)

    题目描述 给定一个二叉树,返回它的前序遍历. 思路 详见链接 代码 递归法 #class TreeNode: # def __init__(self,x): # self.val = x # self ...

  6. Leetcode 144. 二叉树的前序遍历 解题思路及C++实现

    解题思路: 这道题目的解题思路与中序遍历一模一样,区别只在于输出结果放在push进栈之前. 程序的大循环是遍历整个树,所以循环停止条件是:栈为空,且当前访问节点root为NULL,这时说明所有的跟节点 ...

  7. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

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

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

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

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

最新文章

  1. 【Python】青少年蓝桥杯_每日一题_7.11_画太阳
  2. 网络yum源 自定义yum仓库 zip备份 编译安装
  3. 搜索引擎索引之如何建立索引
  4. ISAPI_Rewrite伪静态配置
  5. ASP.NET Core on K8s学习之旅(14)Ingress灰度发布
  6. 微软P2V工具之Disk2VHD
  7. CDH- Hive HWI 配置
  8. input子系统分析一
  9. 吴裕雄--天生自然 高等数学学习:微分中值定理与导数的应用
  10. sql integer字置为空_请写一个函数来检查用户提交的数据是否为整数
  11. 年度重磅!2020年度中国计算机视觉人才调研报告正式发布
  12. velocity 变量 获取_velocity 怎么得到项目根路径
  13. c语言程序设计全文阅读,C语言程序设计(谭浩强).doc
  14. STM32单片机中定义结构体类型指针
  15. 光电传感器实验(红外对管/红外传感器实验)
  16. jQuery学习笔记之closest()
  17. 问号在c语言里面的作用,问号的作用是什么-写作基础知识
  18. Android 仿钉钉、微信 群聊组合头像
  19. [ERROR][logstash.agent] Failed to execute action {:action=>LogStash
  20. python:命令行与环境

热门文章

  1. 慢慢的,就没有了,就像从未存在过(转载)
  2. 80c51流水灯汇编语言,单片机AT89C51可控流水灯课程设计报告(汇编语言).docx
  3. 2019年安大计算机专业分数线,2019年安徽
  4. android4.0教程,图文教程现身,在Win7等系统里跑起Android4.0
  5. python中高阶函数和装饰器_Python高阶函数与装饰器函数的深入讲解
  6. mysql 查询一个数据库里面有多少张数据表
  7. PHP利用分组查询groupby,Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy...
  8. android手机冻屏问题,android 模拟冻屏 代码实现
  9. 调用某个按钮事件_高级UI晋升之触摸事件分发机制(一)
  10. html布局文字设置,div css布局中css中文字体设置