二叉树的中序遍历(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
原创粉丝点击