LeetCodeDay44 —— 二叉树的中序遍历★☆

2018-05-29  本文已影响0人  GoMomi

94. 二叉树的中序遍历

描述
示例
  输入: [1,null,2,3]
    1
      \
      2
      /
    3

  输出: [1,3,2]
  进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路
  1. 递归解法,较为简单,左子树 -> 根 -> 右子树
  2. 非递归解法,利用栈,让代码跟着思路走(参考)
    1).找到左子树最下边的节点,沿途的节点保存到栈中
    2).访问这个节点
    3).访问这个节点的右子树(对于程序而且,这是一棵新的树)
    4).从栈中取出一个节点访问(此时左子树肯定已将都访问完毕了),访问其右子树。
/*
 * 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_94_01 {
 public:
  vector<int> inorderTraversal(TreeNode* root) {
    vector<int> ret;
    _inorderTraversal(root, ret);
    return ret;
  }
  void _inorderTraversal(TreeNode* root, vector<int>& vec) {
    if (!root) return;
    _inorderTraversal(root->left, vec);
    vec.push_back(root->val);
    _inorderTraversal(root->right, vec);
  }
};

class Solution_94_02 {
 public:
  vector<int> inorderTraversal(TreeNode* root) {
    if(!root) return {};
    stack<TreeNode*> mStack;
    TreeNode* node = root;
    vector<int> ret;
    while(node || !mStack.empty()){
      while(node){
        mStack.push(node);
        node = node->left;
      }
      node = mStack.top();
      mStack.pop();
      ret.push_back(node->val);
      node = node->right;
    }
    return ret;
  }
};
上一篇下一篇

猜你喜欢

热点阅读