Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree
Given binary tree
[1,null,2,3]
,1 \ 2 / 3
return
[1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
[Analysis]The state of recursive calls can be simulated by stacks. The key is to find the branch (left or right) where the stack pop() happened. The preorder/inorder,/postorder functions are placed in differnt branch (in, left, right) respectively.
[Solution]
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if (!root) return {};
stack<TreeNode*> st;
TreeNode* p=root;
st.push(p);
vector<int> res;
while(!st.empty()) {
if (st.top()==p && !p->left && !p->right) {
//-- leave node is reached and is at the top of stack.
res.push_back(st.top()->val); //--shared by all orders.
st.pop();
continue;
}
if (st.top()==p) {
//res.push_back(st.top()->val); // -- pre-order output here.
p=p->left;
if (p) st.push(p);
}
else if (st.top()->left==p) {
res.push_back(st.top()->val); // -- in-order output here
p=st.top()->right;
if (p) st.push(p);
}
else if (st.top()->right==p) {
//res.push_back(st.top()->val); //-- post-order output here
p=st.top();
st.pop();
}
}
return res;
}
};
No comments:
Post a Comment