二叉树的递归遍历

本篇将介绍前后中序的递归写法,一些同学可能会感觉很简单,其实不然,我们要通过简单题目把方法论确定下来,有了方法论,后面才能应付复杂的递归。

这里帮助大家确定下来递归算法的三个要素。每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

前中后遍历模板

前序:

  1. void traversal(TreeNode treeNode, List<Integer> list) {
  2. if (treeNode == null) {
  3. return;
  4. }
  5. list.add(treeNode.val); // 中
  6. traversal(treeNode.left, list); // 左
  7. traversal(treeNode.right, list); // 右
  8. }

中序:

  1. void traversal(TreeNode treeNode, List<Integer> list) {
  2. if (treeNode == null) {
  3. return;
  4. }
  5. traversal(treeNode.left, list); // 左
  6. list.add(treeNode.val); // 中
  7. traversal(treeNode.right, list); // 右
  8. }

后序:

  1. void traversal(TreeNode treeNode, List<Integer> list) {
  2. if (treeNode == null) {
  3. return;
  4. }
  5. traversal(treeNode.left, list); // 左
  6. traversal(treeNode.right, list); // 右
  7. list.add(treeNode.val); // 中
  8. }

对于N叉数递归法也思路也是一致的:

例如:

N叉树递归的前序遍历

  1. public Node preTraversal(Node root) {
  2. if (root == null) {
  3. return null;
  4. }
  5. // 输出结果
  6. res.add(root.val);
  7. // 递归遍历
  8. for (int i = 0; i < root.children.size(); i++) {
  9. preTraversal(root.children.get(i));
  10. }
  11. return root;
  12. }

N叉树递归的后序遍历

  1. public Node postTraversal(Node root) {
  2. if (root == null) {
  3. return null;
  4. }
  5. // 递归遍历
  6. for (int i = 0; i < root.children.size(); i++) {
  7. postTraversal(root.children.get(i));
  8. }
  9. // 输出结果
  10. res.add(root.val);
  11. return root;
  12. }