文章标题
来源:互联网 发布:网络课程评价标准 编辑:程序博客网 时间:2024/06/01 10:44
问题描述
Given a binary tree, return the inorder traversal of its nodes’ values.For example:
Given binary tree [1,null,2,3],1\ 2/3
return [1,3,2].
Note: Recursive solution is trivial, could you do it iteratively?
解决思路
如果用递归处理中序遍历真的太简单了。。。这里强调使用非递归的方法。而一种很简单的思路就是开一个stack存储节点,如果栈顶结点存在右结点,push右结点,如果不存在右结点存在左结点,则pop掉栈顶的结点,push左结点。如果左右子结点都不存在,则pop掉栈顶。(这里存在一个问题,无法识别一个节点是否被便利过了。存在重复被添加的情况,造成内存爆炸)。
而其实小伙伴提供了另外一个方法,就是每次都先压入左子树的节点,然后一直压右子树的节点,然后在下一次处理时,pop掉栈顶,压入左子树,然后再一直压右子树的节点。(这个样子,可以确保每次栈里面的节点都是没有被便利过的。)代码
这里使用的是我的简单思路的做法,主要加入了识别一个节点是否被遍历过的处理。(将遍历过的节点的值设成INT_MAX)
/** * 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> inorderTraversal(TreeNode* root) { if (root == NULL) return vector<int>(); stack<TreeNode*> nodestack; vector<int> result; nodestack.push(root); while(!nodestack.empty()) { TreeNode* now = nodestack.top(); if ((now->right == NULL || now->right->val == INT_MAX) && now->left == NULL) { result.push_back(now->val); nodestack.pop(); now->val = INT_MAX; } else if ((now->right == NULL || now->right->val == INT_MAX)) { result.push_back(now->val); nodestack.pop(); nodestack.push(now->left); now->val = INT_MAX; } else { nodestack.push(now->right); } } reverse(result.begin(),result.end()); return result; }};
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- Android AsyncTask使用详解
- 算法分析课每周练习 Max Points on a Line
- [LeetCode] 91. Decode Ways
- ant使用
- nginx启用brotli压缩算法
- 文章标题
- 关于并行计算的一些名词
- jackjson实现javabean转换为json
- 1.2.4 Box of Bricks
- CSS3选择器
- ASP.NET MVC中使用Spring.Net实现IOC和DI
- 深入理解计算机读书笔记1(计算机组成)
- View的绘制
- Technocup 2017