题目
给定一个二叉树,返回它的中序遍历。
思路一 递归
class Solution {
public List < Integer > inorderTraversal(TreeNode root) { //递归
List < Integer > res = new ArrayList <> ();
helper(root, res);
return res;
}
public 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);
}
}
}
}
思路二 迭代
手动维护一个栈
//模板
while (栈非空 || root != null) {
if (root != null) {
}
else {
}
}
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> a = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if(root == null)
return a;
while(!stack.isEmpty() || root != null){
if(root != null){
stack.push(root);
root = root.left;
}
else{
root = stack.pop();
a.add(root.val);
root = root.right;
}
}
return a;
}
}
思路三 颜色标记
看到LeetCode 上题解的巧妙办法,思路递归和堆栈结合,根据前中后序的顺序不同只需要改变代码的特定的那三行。作者:hzhu212
核心思路:
- 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
- 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
- 如果遇到的节点为灰色,则将节点的值输出。
class Solution {
class ColorNode {
TreeNode node;
String color;
public ColorNode(TreeNode node,String color){
this.node = node;
this.color = color;
}
}
public List<Integer> inorderTraversal(TreeNode root) {
if(root == null) return new ArrayList<Integer>();
List<Integer> res = new ArrayList<>();
Stack<ColorNode> stack = new Stack<>();
stack.push(new ColorNode(root,"white"));
while(!stack.empty()){
ColorNode cn = stack.pop();
if(cn.color.equals("white")){
if(cn.node.right != null) stack.push(new ColorNode(cn.node.right,"white"));
stack.push(new ColorNode(cn.node,"gray"));
if(cn.node.left != null)stack.push(new ColorNode(cn.node.left,"white"));
}else{
res.add(cn.node.val);
}
}
return res;
}
}