94. Binary Tree Inorder Traversal
Description:
Given a binary tree, return the inorder traversal of its nodes’ values.
Difficulty:Medium
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
方法1: Recursive
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
l
o
g
n
)
O\left ( logn \right )
O(logn)
思路:
判断根节点是否为空,再分别递归左右子树。
class Solution {
public:
vector<int> res;
vector<int> inorderTraversal(TreeNode* root) {
if (root == NULL)
return res;
inorderTraversal(root->left);
res.push_back(root->val);
inorderTraversal(root->right);
return res;
}
};
方法2: Stack
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
n
)
O\left ( n\right )
O(n)
思路:
将整个节点push到stack,一直装左孩子,直到NULL,这时开始pop,并将value记录到result中。
分两个过程来理解,最里层的循环是一直push,外面的循环是pop节点出来,当既没有节点可以push又没有节点可以pop的时候,整个循环结束。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode *cur = root;
while (cur != NULL || !s.empty()) {
while (cur != NULL) {
s.push(cur);
cur = cur->left;
}
cur = s.top();
s.pop();
res.push_back(cur->val);
cur = cur->right;
}
return res;
}
};