【数据结构】 二叉树 | 深度优先遍历之递归法

159 阅读3分钟

二叉树基础

入度和出度是什么?

根节点和叶节点是什么?

二叉树有哪些分类?

  1. 满二叉树:只有度为0和杜威2的节点,并且度为0的节点在同一层上,则为满二叉树。说人话就是,如果一颗二叉树的层数是k,那么它一定有2^k-1个节点,也就是说除最下面一层之外,每一个节点都有两个分叉。
  2. 完全二叉树:除最后一层没有完全填满,其他层节点都达到最大值,并且最后一层的节点都集中在最左边。图片来源:代码随想录 (programmercarl.com) image.png 优先级队列的本质是堆,堆是一种完全二叉树,同时保证了父子节点的顺序关系。
  3. 二叉搜索树:前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。注意:这里是所有节点都满足一定的大小关系,不只是第一层和第二层。
  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉排序树 image.png
  1. 平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。顾名思义,就是左右子树的大小平衡,不能相差太多,最多相差一层,这样设计是为了加快搜索速度。

二叉树的定义

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;
  	}
}

深度优先遍历

image.png

前序、中序、后序遍历是指什么?
  • 前序遍历是指”中“的位置,比如:“中”在“左右”之前,为前序遍历
迭代法和递归法是什么?

迭代法和递归法都是循环的一种。

  • 递归是重复调用函数本身实现循环,底层是栈,遇到满足终止条件的情况时,逐层返回来结束,所以可能导致栈溢出。初学者理解难度比较大,可以通过画图仔细思考。
  • 迭代和普通循环的区别是:迭代时,循环代码中参与运算的遍历同时是保存结果的遍历,当前保存的结果作为下一次循环计算的初始值,如斐波那契数列的计算。迭代法使用计数器结束循环。
  • 二者关系:所有的迭代法都可以转化成递归,但是递归不一定可以转化成迭代。

前序遍历144. 二叉树的前序遍历 - 力扣(LeetCode)

image.png

image.png

思路:

递归法逐层返回:

  1. 递归函数的参数traversal(?)
参数
当前节点TreeNode node
记录数据ArrayLIst<Integer> result
返回值void
  1. 递归终止条件 当前节点为null;返回

  2. 递归函数体
    根据遍历顺序,完成节点值记录

    public void pretraversal(TreeNode node,ArrayList<Integer> result) {
        if(node == null) {
            return;
        }
        result.add(node.val);// 中
        pretraversal(node.left,result);// 左
        pretraversal(node.right,result);// 右
    }

代码:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        pretraversal(root,result);
        return result;
    }
    public void pretraversal(TreeNode node,ArrayList<Integer> result) {
        if(node == null) {
            return;
        }
        result.add(node.val);// 中
        pretraversal(node.left,result);// 左
        pretraversal(node.right,result);// 右
    }
}

学习时长:45min