1,原文
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
2,题目
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
3,解法
解法一:
递归
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
helper(root,res);
return res;
}
private void helper(TreeNode root, List<Integer> res) {
if(root != null) { //一定要判空。。。。
if(root.left != null){
helper(root.left,res);
}
res.add(root.val);
if(root.right != null){
helper(root.right,res);
}
}
}
}
解法二
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
while (current!= null || !stack.isEmpty()){
while (current != null){
stack.push(current);
current = current.left;
}
current = stack.pop();
res.add(current.val);
current = current.right;
}
return res;
}
}
解法三
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
final String WHITE = "white";
final String GRAY = "gray";
List<Integer> res = new ArrayList<>();
if(root != null){
Stack<ColorNode> stack = new Stack<>();
stack.push(new ColorNode(root,WHITE));
while (!stack.isEmpty()){
ColorNode cur = stack.pop();
if(cur.color == GRAY){
res.add(cur.node.val);
}else{
if(cur.node.right != null){
stack.push(new ColorNode(cur.node.right,WHITE));
}
stack.push(new ColorNode(cur.node,GRAY));
if(cur.node.left != null){
stack.push(new ColorNode(cur.node.left,WHITE));
}
}
}
}
return res;
}
class ColorNode{
TreeNode node;
String color;
public ColorNode(TreeNode node,String color){
this.node = node;
this.color = color;
}
}
}