思路:
1.中序遍历,左 根 右

  1. 递归
    3.栈,先把左边所有节点放在stack中,然后取栈顶元素,即最后一个左节点,这就是左 或者根,然后看他有没有右节点,右的话,那就再次遍历它的左子树取出来。没有右节点,栈中取第二个栈顶元素继续。
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] inorderTraversal (TreeNode root) {
        // write code here
        if(root == null){
            return new int[]{};
        }
        //左 根 右
        ArrayList<Integer> result = new ArrayList<Integer>();
        inOrderBFS(root,result);
        return result.stream().mapToInt(Integer::intValue).toArray();
    }
    private void inOrder(TreeNode node, ArrayList<Integer> result){
        if(node == null){
            return;
        }
        inOrder(node.left, result);
        result.add(node.val);
        inOrder(node.right, result);
    }
    
    private void inOrderBFS(TreeNode node , ArrayList<Integer> result){
        if(node == null){
            return;
        }
        
        Stack<TreeNode> stack = new Stack<>();
        TreeNode currentNode = node;
        while(currentNode != null || !stack.empty()){
            
            while(currentNode != null){
                stack.push(currentNode);
                currentNode = currentNode.left;
            }
            currentNode = stack.pop();
            //最后一个左节点
            result.add(currentNode.val);
            //左节点的右节点
            currentNode = currentNode.right;
            
        }
        
    }
}