145. 二叉树的后序遍历
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[3,2,1]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
提示:
- 树中节点的数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
代码:
// 递归 /** * 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 postorder(struct TreeNode* root, int* res, int* returnSize) { if (root) { postorder(root->left, res, returnSize); postorder(root->right, res, returnSize); res[(*returnSize)++] = root->val; } } int* postorderTraversal(struct TreeNode* root, int* returnSize) { int* res = (int*)malloc(sizeof(int) * 100); *returnSize = 0; postorder(root, res, returnSize); return res; }
// 非递归,即循环/迭代 /** * 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* postorderTraversal(struct TreeNode* root, int* returnSize) { *returnSize = 0; int* res = (int*)malloc(sizeof(int) * 100); struct TreeNode* stack[100]; int top = 0; struct TreeNode* p = root; struct TreeNode* flag = NULL; // 作为标记,等于刚刚访问过的元素,初始化为NULL while (p || top != 0) { if (p) { stack[top++] = p; p = p->left; } else { p = stack[top - 1]; // 获取栈顶元素 if (p->right && p->right != flag) { // 栈顶元素有右子树且右子树还没有被访问过 p = p->right; stack[top++] = p; p = p->left; } else { p = stack[--top]; res[(*returnSize)++] = p->val; flag = p; p = NULL; } } } return res; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术