当前位置: 首页 > news >正文

LC144 二叉树的前序遍历

一.任务描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

 

示例 1:

输入:root = [1,null,2,3]

输出:[1,2,3]

解释:

 

示例 2:

输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]

输出:[1,2,4,5,6,7,3,8,9]

解释:

 

示例 3:

输入:root = []

输出:[]

 

示例 4:

输入:root = [1]

输出:[1]

 

二.解题思路:

核心思想

利用树中空闲的指针来记录回溯路径,从而避免使用栈或递归带来的额外空间开销。

算法步骤

  1. 初始化:从根节点开始遍历

  2. 左子树处理

    • 如果当前节点没有左子树,直接访问该节点并转向右子树

    • 如果有左子树,找到当前节点在中序遍历下的前驱节点

  3. 线索建立与断开

    • 第一次访问:建立线索,访问当前节点,转向左子树

    • 第二次访问:断开线索,转向右子树

算法优势

  • 空间复杂度:O(1),只使用常数额外空间

  • 时间复杂度:O(n),每个节点被访问1-2次

  • 不修改树结构:遍历完成后恢复原始树结构

三.代码实现:

C

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* preorderTraversal(struct TreeNode* root, int* returnSize) {if (root == NULL) {*returnSize = 0;return NULL;}int* result = (int*)malloc(sizeof(int) * 100); // 预估大小int count = 0;struct TreeNode* current = root;while (current != NULL) {if (current->left == NULL) {// 如果没有左子树,访问当前节点并转向右子树result[count++] = current->val;current = current->right;} else {// 找到当前节点的前驱节点struct TreeNode* predecessor = current->left;while (predecessor->right != NULL && predecessor->right != current) {predecessor = predecessor->right;}if (predecessor->right == NULL) {// 第一次访问,建立线索并访问当前节点result[count++] = current->val;predecessor->right = current;current = current->left;} else {// 第二次访问,恢复树结构predecessor->right = NULL;current = current->right;}}}*returnSize = count;return result;
}

四.总结:

核心技巧:

  • 线索利用:巧妙利用空闲的右指针记录回溯路径

  • 两次访问策略:第一次访问建立线索,第二次访问恢复结构

  • 空间换时间思维反转:用时间上的轻微代价(重复访问)换取空间的大幅优化

 

http://www.dtcms.com/a/618538.html

相关文章:

  • Map的遍历方式
  • 有没有找人做标书的网站建网站用自己的主机做服务器
  • Day18:二叉树part8(669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)
  • 常见的简单的营销软件宁波seo哪家最便宜
  • 电力系统设备故障因果推理与深度学习驱动的根因分析优化
  • ElasticSearch详解(篇二)
  • 重庆网站建设怎么样来个手机能看的网站2021
  • 网站建设的财务分析wordpress阶梯插件
  • CSS Position(定位)
  • redis安装与部署
  • 做网站的毕业设计做网站用什么语言高效
  • 长春好的做网站公司排名软件推广公司
  • VSCode终极版
  • NFS服务器
  • MYSQL索引的底层数据结构
  • 进程等待
  • 【数学速通】初中高中数学完整内容体系总结
  • 哪个网站做推销产品oshin wordpress
  • 网站qq获取大连在哪个省
  • 高职图书馆网站建设大赛wordpress 图片 存储
  • jEasyUI 设置排序指南
  • IconCache文件
  • Linux进程读写管道的行为详解
  • 零基础学做网站视频上传网站如何做
  • 仿RabbitMQ实现消息队列(三)--muduo介绍与使用
  • 4-Linux驱动开发-字符设备驱动
  • 专业网站建设平台郑州房产网
  • 43 全选,单选
  • stm32f103c8t6寄存器点灯法
  • 【Linux】计算机如何管理软硬件