关闭

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

标签: C++面试二叉树lintcode中序遍历
688人阅读 评论(0) 收藏 举报
分类:

题目来源: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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34208次
    • 积分:983
    • 等级:
    • 排名:千里之外
    • 原创:67篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    最新评论