#94. Binary Tree Inorder Traversal
题目来源:
https://leetcode.com/problems/binary-tree-inorder-traversal/description/题意分析:
用迭代的方式求出树的中序遍历。
思路:维护这样的一个栈:栈元素为指向树节点的指针,对于这个栈里的每个元素node,保证node->left在node的顶层(先访问),node->right在node的底层(后访问),如果这个node已经到达过(用map标记)或者是叶子节点就直接保存到结果里并弹出栈。详细看代码注释。
例子:

代码:
/**
* 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 {
private:
map<TreeNode*, bool> flags;
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
if (root==NULL)
return res;
stack<TreeNode* > s;
s.push(root);
while(!s.empty()){
TreeNode* node=s.top();
if (flags.count(node)||!node->left&&!node->right){ //visited before or a leaf node
res.push_back(node->val);
s.pop();
}
else {
flags[node]=true;
if (node->right!=NULL){ //push node->right at the bottom of node,so we can traverse node first
s.pop();
s.push(node->right);
s.push(node);
}
if (node->left!=NULL){
s.push(node->left);
}
}
}
return res;
}
};