树结构
为了更好的讲解深度优先,先带大家看一下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:二叉搜索树的范围和
先写模板
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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。