【力扣】—— 二叉树的前序遍历、字典序最小回文串

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:数据结构

在这里插入图片描述

📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。

在这里插入图片描述

一、二叉树的前序遍历

二叉树的前序遍历


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);
    }
}

在这里插入图片描述

在这里插入图片描述

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值