Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:数据结构
📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。
力扣
- 一、二叉树的前序遍历
- 1. 题目
- 2. 递归求解
- 3. 迭代求解
- 二、字典序最小回文串
- 1.题目
- 2.双指针实现
一、二叉树的前序遍历
二叉树的前序遍历
1. 题目
2. 递归求解
- 前序遍历:根 —> 左子树 —> 右子树
- 先访问根节点,然后再分别对当前根节点的左子树和右子树重复同样的操作。
- 中序遍历和后序遍历也都是类似的,由此可以看出二叉树遍历本身就具有递归的性质。
/**
* 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<Integer> preorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
// 进行递归
preorder(root, ret);
return ret;
}
public void preorder(TreeNode root, List<Integer> ret) {
if(root == null){
return ;
}
//处理根节点
ret.add(root.val);
//处理左子树
preorder(root.left,ret);
//处理右子树
preorder(root.right,ret);
}
}
3. 迭代求解
- 代码一:
/**
* 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<Integer> preorderTraversal(TreeNode root) {
List<Integer> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
stack.push(cur);
while (!stack.isEmpty()) {
// 取出栈顶元素
TreeNode tmp = stack.pop();
ret.add(tmp.val);
if (tmp.right != null) {
stack.push(tmp.right);
}
if (tmp.left != null) {
stack.push(tmp.left);
}
}
return ret;
}
}
- 代码二:
/**
* 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<Integer> preorderTraversal(TreeNode root) {
// 创建一个 List 存储结果
List<Integer> ret = new ArrayList<>();
if(root == null){
return ret;
}
// 利用栈模拟实现
// 创建一个栈 先进后出
Stack<TreeNode> s = new Stack<>();
TreeNode cur = root;
while(cur != null || !s.isEmpty()){
while(cur != null){
s.push(cur);
ret.add(cur.val);
cur = cur.left;
}
//弹出栈顶元素
TreeNode tmp = s.pop();
cur = tmp.right;
}
return ret;
}
}
二、字典序最小回文串
字典序最小回文串
1.题目
2.双指针实现
- 可以使用双指针对给定的字符串 s 进行遍历。
- 初始时,两个指针 left 和 right 分别指向 s 的首尾。
- 在遍历的过程中,left 每次向右移动一个位置,right 每次向左移动一个位置,这样一来,它们总是指向在最终回文字符串中必须相同的两个字母
- 会有以下两种情况:
- 如果它们指向的字母相同,我们无需进行任何操作。当两个指针指向同一个位置时,也属于这一种情况;
- 如果它们指向的字母不同,由于需要尽可能少的操作,我们会把其中一个字母修改成与另一个字母相同。
- 对于这一次操作,我们需要让最终字符串的字典序最小,因此我们应当贪心地将字典序较大的字母改成与字典序较小的字母相同。
class Solution {
public String makeSmallestPalindrome(String s) {
//转换为数组
char[] array = s.toCharArray();
int left = 0,right = array.length - 1;
while(left < right){
if(array[left] != array[right]){
char tmp = (char)Math.min(array[left],array[right]);
array[left] = tmp;
array[right] = tmp;
}
left++;
right--;
}
return new String(array);
}
}