反转链表牛客BM1
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
//原地反转法
//首先我们先进行初始化复制
//pre要表示头结点的前一个节点
ListNode pre=null;
//代表头结点
ListNode cur=head;
//代表中间节点 缓存cur.next
ListNode temp=null;
while(cur!=null){
//如果此时不保存cur.next;一会就丢了
temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
return pre;
}
}
具体参考我之前博客 有图有真相
https://blog.csdn.net/weixin_56610646/article/details/127384122?spm=1001.2014.3001.5502
BM23 二叉树的前序遍历
描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
输入:
{1,#,2,3}
返回值:
[1,2,3]
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
//首先我们先建立一个数组保存二叉树的值
List<Integer> list=new ArrayList<>();
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
public int[] preorderTraversal (TreeNode root) {
//先取到list
list=preOrder(root);
//创建一个数组a 给a赋值
int[] a=new int[list.size()];
for(int i=0;i<list.size();i++){
a[i]=list.get(i);
}
return a;
}
//用来返回一个list数组
public List<Integer> preOrder(TreeNode root){
//如果参数root为空了 就直接返回list
if(root==null){
return list;
}
list.add(root.val);
//递归
preOrder(root.left);
preOrder(root.right);
return list;
}
}
方法总结:
二叉树的前序遍历,主要就是根左右 所以我们进行递归实现;
而二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。
思路:
什么是二叉树的前序遍历?简单来说就是“根左右”,展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的访问方式,直到到达叶子节点。
从上述前序遍历的解释中我们不难发现,它存在递归的子问题:每次访问一个节点之后,它的左子树是一个要前序遍历的子问题,它的右子树同样是一个要前序遍历的子问题。那我们可以用递归处理:
- 终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
- 返回值: 每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
- 本级任务: 每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。
具体做法:
- step 1:准备数组用来记录遍历到的节点值,Java可以用List,C++可以直接用vector。
- step 2:从根节点开始进入递归,遇到空节点就返回,否则将该节点值加入数组。
- step 3:依次进入左右子树进行递归。