// NC161 二叉树的中序遍历
思想以及分析:
中序遍历 返回的是 左子树、根、右子树对应的值( ".val"获取)
使用递归先从左子树开始,当该循环中止(这里的意思是说最里层的那层循环中止了,因为这时递归到左子树最末端,这时的节点没有左子树了) ,将值赋到 arrList中。再去递归右子树(这样会从最末端的右子树开始)
如果使用非递归解决问题,可以考虑栈stack进行节点的存取,这和栈的先进后出的性质有关,由上面的解析可知,遍历到左子树的最尾端后,再将节点弹出并将节点值(节点内容)添加到arrList中。再去查找右子树进行循环(和递归的方法异曲同工)
这里有一个问题,就是返回值是int,但如果使用了ArrayList,则泛型中的Integer 是int的封装类,要么 新建一个 int数组,且该数组的长度根据动态数组ArrayList的长度而定,通过for循环 将Integer型的列表ArrayList中的值 转给 int型数组,从而返回正确类型。 或者 使用 stream().mapToInt(Integer::valueOf).toArray() 将Integer型转换成 int (这里涉及到了 流 的内容)
代码实现:非递归采取栈
public int[] inorderTraversal (TreeNode root) { ArrayList<Integer> arrList=new ArrayList<>(); Stack<TreeNode> stack=new Stack<>(); while(root!=null || !stack.isEmpty()){ while(root!=null){ stack.push(root); root=root.left; } root=stack.pop(); arrList.add(root.val); root=root.right; } return arrList.stream().mapToInt(Integer::valueOf).toArray(); }
代码实现:递归
public int[] inorderTraversal (TreeNode root) { ArrayListarrList=new ArrayList<>(); inorderTraver(root,arrList); //如果使用 for循环来遍历得到int数组,则 需要 return arr; //int[] arr=new int[arrList.size()]; //for(int i=0;i<arr.length> </arr.length><arr.length> </arr.length>