题目来源:lintcode
原题链接:二叉树的中序遍历
题目:
给出一棵二叉树,返回其节点值的中序遍历。
您在真实的面试中是否遇到过这个题?
样例
给出一棵二叉树 {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模板类进行求解的。 |