「一分钟学算法」二叉树(一)

87 阅读1分钟

二叉树的中序遍历

LeetCode编号:94

解法一

预备知识:递归,遍历顺序:左-根-右

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
   LinkedList<Integer> res = new LinkedList<>();
   public List<Integer> inorderTraversal(TreeNode root) {
       if (root == null) {
           return new LinkedList<>();
      }
       inorderTraversal(root.left);
       res.add(root.val);
       inorderTraversal(root.right);
       return res;
  }
}

提交验证

解法二

预备知识:栈的特性:先进后出

class Solution {
   public List<Integer> inorderTraversal(TreeNode root) {
       LinkedList<Integer> res = new LinkedList<>();
       if (root == null) {
           return res;
      }
       Stack<TreeNode> stack = new Stack<>();
       while (!stack.isEmpty() || root != null) {
           while (root != null) {
               stack.push(root);
               root = root.left;
          }
           if (!stack.isEmpty()) {
               root = stack.pop();
               res.add(root.val);
               root = root.right;
          }
      }
       return res;
  }
}

提交验证

引申

二叉树前序遍历

顺序:根-左-右

代码稍作改动:

   public List<Integer> preorderTraversal(TreeNode root) {
       if (root != null) {
           res.add(root.val);//先跟节点
           preorderTraversal(root.left); //递归左节点
           preorderTraversal(root.right);//递归右节点
      }
       return res;
  }

二叉树后序遍历

顺序:左-右-根

代码稍作改动:

   public List<Integer> postorderTraversal(TreeNode root) {
       if (root != null) {
           postorderTraversal(root.left);
           postorderTraversal(root.right);
           res.add(root.val);
      }
       return res;
  }

总结

前序/中序/后序,遍历对应的根节点为前/中/后,子树均为先左后右。

递归方案解法容易理解,Stack栈方案比较绕。性能相似。或者说能用Stack栈解决的方案均可以用递归算法处理。

涉及算法:递归,数据结构:栈

作用

  • 前序遍历

    • 输出某个文件夹下所有文件名及子文件夹
    • 获取树的最大深度
  • 后序遍历

    • 统计某个文件夹的大小(该文件夹下所有文件的大小