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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值