LeetCode 94 二叉树的中序遍历

题目

给定一个二叉树,返回它的中序遍历。

思路一 递归

 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;
    }
}
展开阅读全文
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值