给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
思路1:递归
- 先遍历左子树;
- 访问根节点;
- 遍历右子树;
代码:
public class Inorder94digui {
int val;
Inorder94digui left;
Inorder94digui right;
Inorder94digui(int x) {
val = x;
}
public List<Integer> inorderTraversal(Inorder94digui root) {
ArrayList<Integer> result = new ArrayList<Integer>();
if (root == null) {
return result;
}
result.addAll(inorderTraversal(root.left));
result.add(root.val);
result.addAll(inorderTraversal(root.right));
return result;
}
}
思路2:非递归
- 利用栈实现;
- 遇到结点入栈,遍历左子树,当左子树结束,出栈;
- 然后右指针再去遍历右子树;
- 栈空结束;
代码:
public class Inorder94diedai {
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
TreeNode now = root;
while (now != null || !stack.isEmpty()) {
while (now != null) {
stack.push(now);
now = now.left;
}
now = stack.pop();
list.add(now.val);
now = now.right;
}
return list;
}
}