代码随想录算法训练营第14天 | 树的理论基础 、递归遍历、迭代遍历、统一逻辑迭代遍历

48 阅读1分钟

 理论基础 

  • 二叉树的种类:满二叉树,完全二叉树,二叉搜索树,平衡二叉搜索树
  • 存储方式:数组存储与链表存储
  • 遍历方式:深度优先与广度优先

文章讲解:programmercarl.com/%E4%BA%8C%E…

 递归遍历 

递归前序遍历

// 二叉树的前序遍历
class Solution {
  public List<Integer> preorderTraversal(TreeNode root) {
      List<Integer> result = new ArrayList<Integer>();
      preorder(root, result);
      return result;
  }

  public void preorder(TreeNode root, List<Integer> result) {
      if (root == null) {   //叶子节点直接返回即可
          return;
      }
      result.add(root.val);   //先访问父节点的值
      preorder(root.left, result);  //访问左节点
      preorder(root.right, result);  //访问有节点
  }

递归中序遍历

class Solution {
  public List<Integer> inorderTraversal(TreeNode root) {
      List<Integer> res = new ArrayList<>();
      inorder(root, res);
      return res;
  }

  void inorder(TreeNode root, List<Integer> result) {
      if (root == null) {   //叶子节点直接返回即可
          return;
      }
      inorder(root.left, result);    //先访问左节点
      list.add(root.val);            //然后访问父节点的值
      inorder(root.right, result);   //最后访问右节点
  }
}

递归后续遍历

class Solution {
  public List<Integer> inorderTraversal(TreeNode root) {
      List<Integer> res = new ArrayList<>();
      inorder(root, res);
      return res;
  }

  void inorder(TreeNode root, List<Integer> result) {
      if (root == null) {   //叶子节点直接返回即可
          return;
      }
      inorder(root.left, result);    //先访问左节点
      inorder(root.right, result);   //最后访问右节点
      list.add(root.val);            //然后访问父节点的值 
  }
}

题目链接/文章讲解/视频讲解:programmercarl.com/%E4%BA%8C%E…

 迭代遍历 

思路:前序与后序代码逻辑类似,但是与中序代码逻辑完全不一样

题目链接/文章讲解/视频讲解:programmercarl.com/%E4%BA%8C%E…

 统一迭代   

思路:遇到要访问的值,则将该值后面加一个null进行标记,每遇到null则弹出null前面的一个元素到result中

题目链接/文章讲解:programmercarl.com/%E4%BA%8C%E…

总结

迭代遍历的逻辑想了大半天,但是还是没怎么掌握,统一迭代的逻辑思路大体了解了