LeetCode94 Binary Tree Inorder Traversal

Given a binary tree, return the inorder traversal of its nodes' values. (Medium)

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?

 

分析:

太经典基础的算法问题了,但想写出一个无bug的非递归二叉树中序遍历也不是很容易。先看递归版本的代码:

 1 class Solution {
 2 private:
 3     vector<int> result;
 4     void helper(TreeNode* root) {
 5         if (root == nullptr) {
 6             return;
 7         }
 8         helper(root -> left);
 9         result.push_back(root -> val);
10         helper(root -> right);
11     }
12 public:
13     vector<int> inorderTraversal(TreeNode* root) {
14         helper(root);
15         return result;
16     }
17 };

再考虑非递归,其实就是对于每个节点,走到最左端,沿路径压栈。

到达最左端后以此返回,开始弹栈,对于每个弹出的元素,记录其value,并且走向其右节点重复上述过程(走到最左端...)。

直到栈内元素为空为止。

代码:

 1 class Solution {
 2 public:
 3     vector<int> inorderTraversal(TreeNode* root) {
 4         vector<int> result;
 5         stack<TreeNode*> s;
 6         TreeNode* p = root;
 7         while (p || !s.empty()) {
 8             while (p != nullptr) {
 9                 s.push(p);
10                 p = p -> left; 
11             }
12             if (!s.empty()) {
13                 p = s.top();
14                 result.push_back(p -> val);
15                 s.pop();
16                 p = p -> right;
17             }
18         }
19         return result;
20     }
21 };

 

posted @ 2016-10-25 22:00  wangxiaobao1114  阅读(619)  评论(0编辑  收藏  举报