递归回溯的想法
文心一言关于递归的说明:在计算机科学中,递归是一个函数在其自身内部调用自身的过程。递归的"递"指的是函数在调用自身时,将执行上下文(包括局部变量等信息)传递给下一次函数调用的过程。每一次函数调用都会产生一个新的执行上下文,这些上下文在函数不断调用自身的过程中累积,直到最终达到递归终止条件,所有的执行上下文都会按照调用的逆序逐一返回,这个过程被称为"回归"。因此,"递归"的"递"和"归"分别表示了函数在自我调用过程中执行上下文的传递和最终执行上下文的回归。
迭代的本意:当前结果作为下一次参数
文心一言关于迭代的说明:
在计算机科学中,迭代是一种重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。
“迭”指的是一次对过程的重复,即一次迭代。具体来说,迭代计算是数值计算中一类典型方法,应用于方程求根,方程组求解,矩阵求特征值等方面。这些计算方法的基本思想是逐次逼近,先取一个粗糙的近似值,然后用同一个递推公式,反复校正此初值,直至达到预定精度要求为止。
“代”指的是每一次迭代得到的结果会作为下一次迭代的初始值,即用上一次迭代的结果代替(传递)给下一次迭代。
因此,“迭代”的“迭”指的是重复执行的过程,而“代”则指的是用上一次的结果代替下一次的初始值。
第一层的左右递确定了两个底角和一个顶角(root),宏观上看(1)先递左然后左归中(2)再递右然后右归中(3)最后继续执行完中的剩下语句,再当成外层的底角归给上一级。当然递给左,左的内部也要递归,递给右,右的内部也要递归。递的顺序就是迭代遍历的顺序,一般取类似左右中的后序遍历。
从二叉树图形上看递的过程:(假设先递左后递右,每个节点左枝大于等于右枝,以便同级别的左节点开始归的时候右也归)最先递到结束条件的分支是最左枝,然后从该枝的叶子节点开始归,从图形上看不停地循环从三角形左角-->右角-->顶角的归的过程,归完一个一个三角形就以该三角形为新的左子树,该顶角同级别右节点再开始递下去,重复刚才的过程完成右子树的归(图形上看也是走一个三角形从左下角到右下角到顶角)如此反复一直归到以root为顶角的三角形
关于假设先递左后递右时,取每个节点左枝大于等于右枝的模型的理由:递到左枝是null是能及时两角同时归中方便构建静态模型(1)左枝大于等于右枝,例如【1,2,null】模型,2左枝归的时候同级右枝是null能及时归中(2)【1,null,2】这个模型右枝大,左枝是null归中时同级的2还在递,不好归中时构建一个静态模型设置操作语句。往2下面再第一层就是【2,null,null】,属于左枝等于右枝。
LeetCode:110.平衡二叉树代码随想录
利用递归的回溯过程(以前叫自底而上)解题时,要设置好回溯初始值和回溯变化量,本题回溯初始值设置为0,变化量逐层加一
与之对应的利用递归内嵌进入的过程解题时,设置好迭代变量
计算高度时,遇到节点存在null节点时(叶子节点或节点一枝非null另一支是null),计数为0 return给其父节点,计算其父节点的高度时要在此基础上加一。
构建一个 [1 , 2 , null , 3 ,4 ,null ,null] 的归的起始端模型。
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
public int getHeight(TreeNode root) {
if(root == null){
return 0;
}
int leftHeight = getHeight(root.left);
if(leftHeight == -1){
return -1;
}
int rightHeight = getHeight(root.right);
if(rightHeight == -1){
return -1;
}
if(Math.abs(leftHeight - rightHeight) > 1){
return -1;
}
return Integer.max(leftHeight , rightHeight) + 1;
}
}
257. 二叉树的所有路径代码随想录
在递的时候添加筛选条件,非null的子树可以递,归的回来后又做了一些删除操作
递的参数有多个,要使得内层函数能修改要把容器的引用递下去
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<Integer> paths = new ArrayList<>();
List<String> res = new ArrayList<>();
traversal(root , paths , res);
return res;
}
void traversal(TreeNode root , List<Integer> paths , List<String> res){
paths.add(root.val);
if(root.left == null && root.right == null){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < paths.size()-1; i++){
sb.append(paths.get(i)).append("->");//字符串->要加双引号
}
sb.append(paths.get(paths.size() - 1));
res.add(sb.toString());
return;
}
if(root.left != null){
traversal(root.left , paths , res);
paths.remove(paths.size() - 1);//remove参数应该是索引
}
if(root.right != null){
traversal(root.right , paths , res);
paths.remove(paths.size() - 1);
}
}
}
404.左叶子之和代码随想录
在叶子级节点处构建模型
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root == null){
return 0;
}
if(root.left == null && root.right == null){
return 0;
}
int sum = 0;
int leftValue = sumOfLeftLeaves(root.left);
if(root.left != null && root.left.left == null && root.left.right == null){
leftValue = root.left.val;
}
int rightValue = sumOfLeftLeaves(root.right);
sum = leftValue + rightValue;
return sum;
}
}