https://leetcode.com/problems/binary-tree-inorder-traversal/
这道题如果用递归的话非常简单。
如果不用递归,那么就是用一个栈,把有左节点的node push到栈中,知道没有左节点为止,然后pop一个节点,把这个节点的值输出,这个节点的右节点,以及右节点左边的节点又依次push到栈中。但是这个解法问题就是,需要Push的时候,是判断一个节点是否有左节点和右节点,但有可能这个节点的所有左边节点都已经被处理过了,那么要么破坏原来树的结构,要么用hashtable来记录已经处理过的节点。
后来发现其实根本不需要这样,这个方法是用一个node来记录下一个要处理的节点,保证当一个节点pop出来的时候,它的所有左子树都已经处理过了,就只需要再看它右节点了,这样就可以避免把已经处理过的节点再次放到栈中:
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> rst = new LinkedList<Integer>();
if(root == null) return rst;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while(!stack.empty() || node!=null){
while(node!=null){
stack.push(node);
node = node.left;
}
node = stack.pop();
rst.add(node.val);
node = node.right;
}
return rst;
}
}