94. 二叉树的中序遍历(非递归实现)

题目描述

Given a binary tree, return the inorder traversal of its nodes values.
For example:
Given binary tree{1,#,2,3},

   1
    \
     2
    /
   3

return[1,3,2].
Note: Recursive solution is trivial, could you do it iteratively?

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

代码实现

C++实现

class Solution {
public:
    vector<int> inorderTraversal(TreeNode *root) {
      vector<int> ret;
      stack<TreeNode*> s;
      TreeNode *p=root;
     
      while(p!=NULL||!s.empty())
      {   
          while(p!=NULL)
          {
            s.push(p);
            p=p->left;
         }
           
         if(!s.empty())
         {
            p=s.top();
            ret.push_back(p->val);
            s.pop();
            p=p->right;
         }
     }

     return ret;
    }
};

node.h:

using namespace std;

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

in_order.cpp:

#include "node.h"
#include <vector>
#include <stack>

using namespace std;

vector<int> inorderTraversal(TreeNode *root) {

    if(root == nullptr)
        return {};
    vector<int> ret;
    stack<TreeNode *> stk;
    TreeNode *p = root;
    while(true)
    {
        while(p!=nullptr)
        {
            stk.push(p);
            p = p->left;
        }
        if(!stk.empty())
        {
            TreeNode *temp = stk.top();
            stk.pop();
            ret.push_back(temp->val);
            p = temp->right;
        }
        else
            break;
    }
}

java实现

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        Deque<TreeNode> stk = new LinkedList<>();
        TreeNode p = root;
        while (true) {
            while (p != null) {
                stk.push(p);
                p = p.left;
            }
            if (!stk.isEmpty()) {
                p = stk.peek();
                stk.pop();
                ret.add(p.val);
                p = p.right;
            } else
                break;

        }
        return ret;
    }
}

posted on 2021-05-16 12:25  朴素贝叶斯  阅读(92)  评论(0编辑  收藏  举报

导航