二叉树的中序遍历(lintcode)(递归和非递归)

原创 2015年11月19日 22:04:59

题目来源: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模板类进行求解的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

LintCode -- 二叉树的中序遍历

LintCode -- binary-tree-inorder-traversal(二叉树的中序遍历) 原题链接:http://www.lintcode.com/zh-cn/problem/bina...
  • chan15
  • chan15
  • 2015年09月30日 20:44
  • 1419

lintcode 二叉树的中序遍历

给出一棵二叉树,返回其中序遍历 题解参考   http://blog.csdn.net/workformywork/article/details/21628351?utm_source=tui...

lintcode- 前序遍历和中序遍历树构造二叉树-73

/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left,...

二叉树的三种遍历方式的递归算法C代码

基本概念 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。 二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right ...

数据结构例程——二叉树遍历的递归算法

本文是数据结构基础系列(6):树和二叉树中第10课时二叉树的遍历的例程。【二叉树遍历的递归算法】   实现二叉树的先序、中序、后序遍历的递归算法,并对用”A(B(D,E(H(J,K(L,M(,N))...

利用非递归方法实现二叉树的中序遍历

#include #include #define N 7 using namespace std; typedef struct node { struct node *leftChild; ...
  • stpeace
  • stpeace
  • 2012年11月02日 10:45
  • 1213

二叉树的中序遍历(非递归)

在二叉树的中序遍历中,访问节点的操作发生在该节点的左子树遍历完毕并准备遍历右子树时,所以,在遍历过程中遇到某节点时并不能立即访问它,而是将它压栈,等到它的左子树遍历完毕后,再从栈中弹出并访问之。 中...

非递归方法,二叉树的中序遍历

#include #include #include #include using namespace std; typedef struct Bintree* tree;//tree是指向结构体的指...

利用非递归方法实现二叉树的中序遍历

#include #include #define N 7 using namespace std; typedef struct node { struct node *leftChild; ...

图解二叉树非递归版的中序遍历算法

你会学到什么 讨论的问题是什么 这个问题相关的概念和理论 非递归版中序遍历算法 代码思考 算法技巧 实现代码 快照 评价算法 总结 欢迎关注算法思考与应用公众号 你会学到什么?树的递归遍历算法很容易理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的中序遍历(lintcode)(递归和非递归)
举报原因:
原因补充:

(最多只允许输入30个字)