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

144. 二叉树的前序遍历

题目

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

解题思路

递归

代码

/*** 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().*/// 辅助函数:递归前序遍历
void preorderHelper(struct TreeNode* root, int* result, int* index) {if (root == NULL) {return;}// 前序遍历顺序:根-左-右result[(*index)++] = root->val;           // 访问根节点preorderHelper(root->left, result, index);  // 递归遍历左子树preorderHelper(root->right, result, index); // 递归遍历右子树
}// 获取树的节点数量
int getTreeSize(struct TreeNode* root) {if (root == NULL) {return 0;}return 1 + getTreeSize(root->left) + getTreeSize(root->right);
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {// 处理空树情况if (root == NULL) {*returnSize = 0;return NULL;}// 计算树的节点数量int size = getTreeSize(root);// 分配结果数组内存int* result = (int*)malloc(size * sizeof(int));if (result == NULL) {*returnSize = 0;return NULL;}// 初始化索引int index = 0;// 递归进行前序遍历preorderHelper(root, result, &index);// 设置返回数组大小*returnSize = size;return result;
}

改进代码

递归会有爆栈的风险,而且递归一次是一次函数调用 涉及到栈帧的增加和减少会额外增加开销,递归的好处是代码比较简洁

迭代算法

迭代实现的核心是使用显式的栈结构来模拟递归过程中的系统调用栈。

算法步骤

  1. 创建一个栈,将根节点压入栈中
  2. 当栈不为空时,循环执行以下操作:
    • 弹出栈顶节点,访问它(即记录其值)
    • 将该节点的右子节点压入栈(如果存在)
    • 将该节点的左子节点压入栈(如果存在)
  3. 当栈为空时,遍历完成
/*** 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 getTreeSizeIterative(struct TreeNode* root) {if (root == NULL) {return 0;}int count = 0;// 使用栈存储待访问的节点struct TreeNode** stack = (struct TreeNode**)malloc(10000 * sizeof(struct TreeNode*));if (stack == NULL) {return 0; // 内存分配失败}// 初始化栈int top = -1;stack[++top] = root;while (top >= 0) {// 弹出节点struct TreeNode* node = stack[top--];count++; // 记录节点数// 注意:由于栈是后进先出,所以要先将右子节点入栈,再将左子节点入栈// 这样才能保证左子节点先于右子节点被处理if (node->right != NULL) {stack[++top] = node->right;}if (node->left != NULL) {stack[++top] = node->left;}}free(stack);return count;
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {if(root == NULL){*returnSize = 0;return NULL;}// 得到节点数*returnSize = getTreeSizeIterative(root);// 为结果分配内存 int* result = (int*) malloc(sizeof(int) * (*returnSize));// 使用栈存储待访问的节点struct TreeNode** stack = (struct TreeNode**)malloc((*returnSize) * sizeof(struct TreeNode*));// 初始化栈int top = -1;stack[++top] = root;int count = 0;while (top >= 0) {// 节点出栈,并记录值struct TreeNode* node = stack[top--];result[count++] = node->val;// 注意:由于栈是后进先出,所以要先将右子节点入栈,再将左子节点入栈// 这样才能保证左子节点先于右子节点被处理if (node->right != NULL) {stack[++top] = node->right;}if (node->left != NULL) {stack[++top] = node->left;}}free(stack);return result;
}
http://www.dtcms.com/a/296690.html

相关文章:

  • rt-thread加一个库
  • matrix-breakout-2-morpheus靶机通关教程
  • Android Studio历史版本快速下载(二次修改记录)
  • Shell的正则表达式
  • (nice!!!)(LeetCode 每日一题) 2322. 从树中删除边的最小分数 (深度优先搜索dfs + 树)
  • linux C -glib库的基本使用
  • 【华为机试】1208. 尽可能使字符串相等
  • 蚁群优化算法(Ant Colony Optimization, ACO)简介
  • Scrcpy启动闪退
  • Function Calling:让大模型学会使用工具
  • es0102---语法格式、数据类型、整合springboot、创建库、创建映射、新增数据、自定义查询
  • tensorflow搭建神经网络
  • SQL基础⑩ | 数据类型篇
  • 哈希表模拟实现
  • Java学习日记_廖万忠
  • Spring Cloud Alibaba Sentinel 源码阅读之流量控制算法
  • C++编程基础四大件
  • Bright Data 实战指南:从竞品数据抓取到电商策略优化全流程
  • 探秘 VSAR软件:CAN报文转DBC信号的便捷工具
  • 力扣189:轮转数组
  • 5 个适合创意创作的网站,灵感不设限
  • 基于markdown封装的前端文档编辑工具,markdown.js的解析与应用
  • 蚁群优化算法(ACO)求解旅行商问题(TSP)
  • 碳油 PCB 技术解析:高精度制造与多场景应用实践
  • Python爬虫案例:Scrapy+XPath解析当当网网页结构
  • Spring Boot 3整合Spring AI实战:9轮面试对话解析AI应用开发
  • FreeRTOS—计数型信号量
  • 亚马逊Prime Day变革:精细化运营时代的号角
  • 基础05-Java控制流程:掌握if-else、switch和循环语句
  • 使用adb 发送广播 动态改变app内的值