菜鸟的刷题之路之二叉树

这篇具有很好参考价值的文章主要介绍了菜鸟的刷题之路之二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💕“成功不是终点,失败不是终结,勇气才是启程的第一步。”💕
🐼作者:不能再留遗憾了🐼
🎆专栏:菜鸟的刷题之路🎆
🚗本文章主要内容:将有序数组转换为二叉搜索树、二叉搜索树中第K小的元素和叶子相似的树的详细题解🚗
菜鸟的刷题之路之二叉树

将有序数组转换为二叉搜索树

将有序数组转换为二叉搜索树(难度:简单)

题目要求

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 :
菜鸟的刷题之路之二叉树

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
菜鸟的刷题之路之二叉树

/**
 * 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 TreeNode sortedArrayToBST(int[] nums) {

    }
}

做题思路

这个题目用到了二叉搜索树相关的知识,如果大家不了解或者忘记了,可以去看看这篇文章二叉搜索树。

二叉树是一种具有特殊性质的二叉树,它的根节点关键字总是大于左孩子的关键字,小于右孩子的关键字。并且这个题目是要求你将有序数组转换成一个高度平衡的二叉搜索树,所以我们就需要保证根节点的左右子树的高度差不超过一,那就是说我们可以每次取有序数组的最中间的值作为根节点,该中间值的左半部分作为左子树,右半部分作为右子树,然后重复进行该操作。

菜鸟的刷题之路之二叉树

代码实现

/**
 * 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 TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBSTChild(nums,0,nums.length-1);
    }

    public TreeNode sortedArrayToBSTChild(int[] nums,int left,int right) {
        if(left > right) return null;
        int mid = left + (right-left) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = sortedArrayToBSTChild(nums,left,mid - 1);
        root.right = sortedArrayToBSTChild(nums,mid + 1,right);

        return root;
    }
}

菜鸟的刷题之路之二叉树

二叉搜索树中第K小的元素

二叉搜索树中第K小的元素(难度:中等)

题目要求

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 :
菜鸟的刷题之路之二叉树

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:31

/**
 * 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 kthSmallest(TreeNode root, int k) {

    }
}

做题思路

因为二叉搜索数的根节点的关键字总是大于左孩子的关键字,小于右孩子的关键字,所以我们可以先在根节点的左树中查找是否存在第 k个最小元素,如果不存在就看根节点是否是最小的第 k 个最小元素,最后在右子树中查找。在查找子树的过程中同样是左孩子 - 根节点 -右孩子的顺序查找。要想实现这种功能,我们需要借助栈这种数据结构,将从根节点到最左边的左孩子节点路径上的节点放入栈中,那么栈顶的元素总是栈中最小的数据,当左孩子不是我们要找的节点时,就看根节点,最后是右孩子。

菜鸟的刷题之路之二叉树

以上思路就是递归的大概思路

代码实现

/**
 * 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 kthSmallest(TreeNode root, int k) {
        Stack<TreeNode> stack = new Stack<>();
        while(root != null || !stack.empty()) {
            while(root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if(--k == 0) break;
            root = root.right;
        }

        return root.val;
    }
}

菜鸟的刷题之路之二叉树

叶子相似的树

叶子相似的树(难度:简单)

题目要求

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
菜鸟的刷题之路之二叉树

举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

示例 :
菜鸟的刷题之路之二叉树

输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
输出:true

/**
 * 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 leafSimilar(TreeNode root1, TreeNode root2) {

    }
}

做题思路

这个题目我们可以参考上面的一个题目,采用中序遍历的方法,判断该节点是否为叶子节点,如果是,就把它放入链表中。分别遍历这两个树,将叶子节点放入链表中,然后看这两个链表是否相同。

代码实现

/**
 * 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 leafSimilar(TreeNode root1, TreeNode root2) {
        if(root1 == null || root2 == null) return false;
        List<TreeNode> list1 = new ArrayList<>();
        List<TreeNode> list2 = new ArrayList<>();
        leafSimilarChild(root1,list1);
        leafSimilarChild(root2,list2);
        if(list1.size() != list2.size()) return false;
        for(int i = 0; i < list1.size(); ++i) {
            if(list1.get(i).val != list2.get(i).val) return false;
        }

        return true;
    }

    private void leafSimilarChild(TreeNode root,List<TreeNode> list) {
        if(root == null) return;
        leafSimilarChild(root.left,list);
        if(root.left == null && root.right == null) list.add(root);
        leafSimilarChild(root.right,list);
    }
}

菜鸟的刷题之路之二叉树文章来源地址https://www.toymoban.com/news/detail-470923.html

到了这里,关于菜鸟的刷题之路之二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • c++之二叉树【进阶版】

    c++之二叉树【进阶版】

    前言         在c语言阶段的数据结构系列中已经学习过二叉树,但是这篇文章是二叉树的进阶版,因为首先就会讲到一种树形结构“二叉搜索树”,学习二叉搜索树的目标是为了更好的理解map和set的特性。二叉搜索树的特性就是左子树键值小于根,右子树键值大于根,所以

    2024年01月18日
    浏览(7)
  • 11. 数据结构之二叉树

    11. 数据结构之二叉树

    上一节,简单概述了树这种数据结构,以及树结构向下,具有某些一些特征的树,比如二叉树,B树,B+树,堆等。其中,二叉树是一个很重要的模块。也是在一些技术面试中,可能会问到的问题。本节,我们就二叉树,做详细介绍。 二叉树是一个 逻辑结构 , 底层可以用数组

    2024年02月07日
    浏览(12)
  • 【C++】二叉树进阶之二叉搜索树

    【C++】二叉树进阶之二叉搜索树

    作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 目标:熟练掌握二叉搜索树,能自己模拟实现二叉搜索树 毒鸡汤:不断的努力,不断的去接近梦想,越挫越勇,吃尽酸甜苦辣,能够抵御寒冬,也能够拥抱春天,这样

    2024年03月16日
    浏览(6)
  • 数据结构之二叉树简介

    二叉树是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表相似,二叉树的基本单元是节点,每个节点包含值,左子节点的索引,右子节点的索引 当给定一个二叉树的节点时,我们将该节点的左子节点及其以下节点形成

    2024年02月01日
    浏览(20)
  • 数据结构之二叉树(Java)

    数据结构之二叉树(Java)

    在这里先说明一下,结点和节点其实一样的,无须关注这个。 1. 概念:树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合。 如上图所示,把此种数据结构称作树是因为它看起来像一个倒挂的树。  2. 特点 有一个特殊的节点,称为根节点,它是唯一

    2024年02月07日
    浏览(11)
  • 数据结构之二叉树(详细版)

    数据结构之二叉树(详细版)

            二叉树作为数据结构的一种,尤为重要,下面是对二叉树的详细讲解。想要了解二叉树,首先要了解 二叉树的基本概念,以及创建二叉树的结构,再深层点,遍历二叉树的前序中序和后续,其次是层序,后面将会讲解如何计算二叉树的高和叶结点 等等。        

    2024年02月03日
    浏览(13)
  • 数据结构之二叉树的实现

    数据结构之二叉树的实现

    目录 前言 1. 二叉树的遍历 1.1二叉树的前、中、后序遍历 1.2 层序遍历 2.二叉树的实现 2.1 二叉树的结构 2.2构建二叉树  2.2 前序遍历的实现 2.3 中序遍历的实现 2.4 后序遍历的实现 2.5 计算树的节点个数 2.6 计算树的深度 2.7 计算叶子节点个数 2.8 计算树第k层的节点数 2.9 以内容

    2023年04月10日
    浏览(12)
  • 《数据结构与算法》之二叉树(补充树)

    《数据结构与算法》之二叉树(补充树)

    二叉搜索树,也称二叉排序树或二叉查找树 二叉搜索树:一棵二叉树,可以为空,如果不为空,应该满足以下性质: 非空左子树的所有结点小于其根结点的键值 非空右子树的所有结点大于其根结点的键值 左右子树都是二叉搜索树 对于二叉树的查找,其实沿用的是分治法的

    2024年02月08日
    浏览(10)
  • 数据结构与算法之二叉树: Leetcode 111. 二叉树的最小深度 (Typescript版)

    二叉树的最小深度 https://leetcode.cn/problems/minimum-depth-of-binary-tree/ 描述 就 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1 示例 2 提示 树中节点数的范围在 [0, 1 0 5 10^5 1 0 5 ] 内

    2024年02月06日
    浏览(14)
  • 数据结构之二叉树的数组表示

    若某节点的索引为 i ,则该节点的左子节点的索引为 2i+1 ,右子节点的索引为 2i+2 给定某节点,获取它的左右字节点,父节点 获取前序遍历,中序遍历,后序遍历,层序遍历

    2024年01月18日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包