思路:
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;
}
}
}