题目描述:
Given a binary tree, return the inorder traversal of its nodes' values.
Example:
Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
中序遍历,不用递归,用迭代
思路:用栈:
来了一个节点,先入栈,然后判断
如果这个节点有左儿子,就把左儿子,左孙子、左曾孙子。。。全入栈
那么到这一步,一定是没有左儿子了,那么出栈一个 并输出
再查看该节点是否有 右儿子,如果有右儿子,就把右儿子入栈(把右儿子的 左孩子、左孙子、左曾孙子全入栈。。。)
写代码的时候,遇到一个死循环的问题,就是从左儿子回到自己的时候,又会判断自己是否有左儿子,就会陷入死循环
解决办法就是:一开始先把起始节点的左孩子们全入栈,然后进入循环while(栈不为空),
在循环中:(1)先出栈(这个节点一定是从左孩子那里过来的),并输出;(2)判断是否有右孩子(把右孩子的 左孩子、左孙子、左曾孙子全入栈。。。)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//中序遍历
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> st = new Stack<TreeNode>();
if(root == null) return list;
st.push(root);
//取出栈的第一个节点
TreeNode node = st.peek();
//如果当前节点有左子树,就把当前节点压栈,把他的左儿子、做儿子一直压栈
while (node.left != null){
st.push(node.left);
node = node.left;
}
while (!st.isEmpty()){
//如果当前节点没有左儿子了,就出栈,并输出
node = st.pop();
list.add(node.val);
//System.out.println(node.val);
//再判断是否有右儿子:如果当前节点有右儿子,就把当前节点压栈
if(node.right != null){
st.push(node.right);
node = node.right;
while (node.left != null){
st.push(node.left);
node = node.left;
}
}
}
return list;
}
}