文章标题

来源:互联网 发布:网络课程评价标准 编辑:程序博客网 时间:2024/06/01 10:44
  1. 问题描述
    Given a binary tree, return the inorder traversal of its nodes’ values.

    For example:
    Given binary tree [1,null,2,3],

    1\ 2/3

    return [1,3,2].

    Note: Recursive solution is trivial, could you do it iteratively?

  2. 解决思路
    如果用递归处理中序遍历真的太简单了。。。这里强调使用非递归的方法。而一种很简单的思路就是开一个stack存储节点,如果栈顶结点存在右结点,push右结点,如果不存在右结点存在左结点,则pop掉栈顶的结点,push左结点。如果左右子结点都不存在,则pop掉栈顶。(这里存在一个问题,无法识别一个节点是否被便利过了。存在重复被添加的情况,造成内存爆炸)。
    而其实小伙伴提供了另外一个方法,就是每次都先压入左子树的节点,然后一直压右子树的节点,然后在下一次处理时,pop掉栈顶,压入左子树,然后再一直压右子树的节点。(这个样子,可以确保每次栈里面的节点都是没有被便利过的。)

  3. 代码
    这里使用的是我的简单思路的做法,主要加入了识别一个节点是否被遍历过的处理。(将遍历过的节点的值设成INT_MAX)

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<int> inorderTraversal(TreeNode* root) {        if (root == NULL)            return vector<int>();        stack<TreeNode*> nodestack;        vector<int> result;        nodestack.push(root);        while(!nodestack.empty()) {            TreeNode* now = nodestack.top();            if ((now->right == NULL || now->right->val == INT_MAX) && now->left == NULL) {                result.push_back(now->val);                nodestack.pop();                now->val = INT_MAX;            }            else if ((now->right == NULL || now->right->val == INT_MAX)) {                result.push_back(now->val);                nodestack.pop();                nodestack.push(now->left);                now->val = INT_MAX;            } else {                nodestack.push(now->right);            }        }        reverse(result.begin(),result.end());        return result;    }};
0 0