头图

树结构

为了更好的讲解深度优先,先带大家看一下java实现树的树结构

//树结构
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;
    }
}

思路

看到树这种结构,首先想到的就是递归版本的深度优先算法,简单,又容易写。

递归版本的深度优先模板

    //万能递归模板
    private void recursion(TreeNode root) {
        //对当前节点进行相应判断
        if(root == null) {
            return;
        }
        //处理逻辑在这里 前序遍历
        recursion(root.right);
        //处理逻辑在这里 中序遍历
        recursion(root.left);
        //处理逻辑在这里 后序遍历
    }

做题前先写下这个模板,然后根据题目往里面套,做适当变形即可。

实践

题目

leetcode938:二叉搜索树的范围和

image.png

先写模板

    private void recursion(TreeNode root) {
        //对当前节点进行相应判断
        if(root == null) {
            return;
        }
        //处理逻辑在这里 前序遍历
        recursion(root.right);
        //处理逻辑在这里 中序遍历
        recursion(root.left);
        //处理逻辑在这里 后序遍历
    }

模板变形

首先看到有输出,所以模板void要改成int,添加返回值
其次有额外的两个参数low,high,所以要加两个参数

public int recursion(TreeNode root, int low, int high) {
        if (root == null) {
            return 0;
        }
        recursion(root.right, low, high);
        recursion(root.left, low, high);
        return 0;
    }

再次,考虑到递归方法有返回值,所以左子树递归和右子树递归的结果肯定要用上,题意是求和,所以得到模板如下

 public int recursion(TreeNode root, int low, int high) {
        if (root == null) {
            return 0;
        }
        return  recursion(root.right, low, high) + recursion(root.left, low, high);
    }

最后再为其添加当前节点的处理逻辑

最终结果

public int recursion(TreeNode root, int low, int high) {
        if (root == null) {
            return 0;
        }
        if (root.val >= low && root.val <= high) {
            return root.val + recursion(root.right, low, high) + recursion(root.left, low, high);
        } else {
            return recursion(root.right, low, high) + recursion(root.left, low, high);
        }
    }

幻想的绝望
1 声望0 粉丝

在绝望中追寻