二叉树的中序遍历(lintcode)(递归和非递归)
来源:互联网 发布:mac ps2017中文破解版 编辑:程序博客网 时间:2024/05/24 07:37
题目来源:lintcode
原题链接:二叉树的中序遍历
题目:
给出一棵二叉树,返回其节点值的中序遍历。
您在真实的面试中是否遇到过这个题?Yes
样例
给出一棵二叉树 {1,#,2,3}
,
1 \ 2 / 3
返回 [1,3,2]
挑战
难度级别你能使用非递归实现么?
容易
思路分析:
此题就是数据结构-树-的常用遍历方式的实现。
一般普通教材上都会提供中序遍历的常规方法,即采用递归方式求解。
本题的挑战就是采用非递归的方式进行求解,那么我就对此进行了尝试。
我们可以想到,递归的方式,是一种栈的数据结构,也就是说传统采用递归的方式,是借助函数栈的方式进行处理的,是一种比较隐蔽的先入先出模式。
那么我们可以采用数据结构-栈-来模拟函数栈的方式进行求解。
将未数据域未遍历到的节点存入到stack中,用cur来指向当前节点;那么就有cur为空或者非空两种情况,我们分开讨论。
1)当cur为空的时候,也就是说我们需要从stack中取出下一个节点记为temp,那么此时的节点中数据域就需要存入到我们的结果数组中,并且如果该节点的右子节点也为空的话,我们此时就将cur指向右子节点(temp->right)(虽然不变也可以,但是本人觉得还是形式上保持一致比较好),如果该子节点的右子节点不为空的话,那么我们将temp指向右子节点(即temp = temp->right),将temp放入stack中,并将cur指向此时的temp节点的左节点;
2)当cur不为空的时候,此种情况较为简单,只要将cur放入stack中,并将cur指向当前节点的左节点,即 cur = cur->left;
实现代码:
<span style="font-size:14px;">#include <iostream>#include <stack>#include <vector>using namespace std;// Definition of TreeNode: class TreeNode { public: int val; TreeNode *left, *right; TreeNode(int val) { this->val = val; this->left = this->right = NULL; } };class Solution { /** * @param root: The root of binary tree. * @return: Inorder in vector which contains node values. */public: //非递归版 vector<int> inorderTraversal(TreeNode *root) { vector<int> result; if (root == NULL) { return result; } stack<TreeNode *> intStack; //queue<TreeNode *> intQueue; intStack.push(root); TreeNode *cur = root->left; while (!intStack.empty()) { if (cur == NULL) { TreeNode *temp = intStack.top(); intStack.pop(); result.push_back(temp->val); if (temp->right != NULL) { temp = temp->right; intStack.push(temp); cur = temp->left; }else { cur = temp->right; } }else { intStack.push(cur); cur = cur->left; } } return result; } /* // 递归版本 vector<int> inorderTraversal(TreeNode *root) { // write your code here vector<int> result; if (root == NULL) { return result; }else { inorderCore(root, result); } return result; } void inorderCore(TreeNode *root, vector<int> &result) { if (root->left != NULL) { inorderCore(root->left, result); } result.push_back(root->val); if (root->right != NULL) { inorderCore(root->right, result); } return; } */};</span>
代码说明:
需要说明的是,本题我采用STL模板中的stack模板类进行求解的。
0 0
- 二叉树的中序遍历(lintcode)(递归和非递归)
- lintcode-二叉树的中序遍历(非递归)-67
- Lintcode 二叉树的中序遍历(递归+非递归)
- 【LintCode-67】二叉树的中序遍历(Java实现-递归算法/非递归算法)
- Lintcode 二叉树的前序遍历 (递归和非递归法)
- LintCode Binary Tree Inorder Traversal 二叉树的中序遍历(非递归)
- 【LintCode-66】二叉树的前序遍历(Java实现-递归算法/非递归算法)
- lintcode-二叉树的前序遍历(非递归)-66
- LintCode 二叉树的遍历 (非递归)
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树非递归后序遍历(非递归遍历中最麻烦的一个)
- 二叉树的中序递归,非递归遍历
- 二叉非递归的中序遍历(递归创建)
- 二叉树的遍历(递归和非递归)
- 二叉树的遍历(递归和非递归)
- 二叉树的建立和遍历(递归、非递归)
- 二叉树的遍历(非递归和递归实现)
- 【开发知识储备】UNIX操作系统和Linux操作系统
- poj--2935(bfs+记录路径)
- hdu 2642 Stars
- Android的线程与线程池
- IOS学习——GCD和后台处理
- 二叉树的中序遍历(lintcode)(递归和非递归)
- 第三章 scala入门再探
- Mahjong
- 嵌入式Linux中BusyBox的使用
- Checklists学习日志之父类、子类、继承、重写
- 嵌入式Linux函数之printfk()函数
- Solr之——整合mmseg4j中文分词库
- Win7干净地卸载oracle11g
- 国内CA现状