首页 > 其他分享 >【树】二叉树的应用 I

【树】二叉树的应用 I

时间:2024-01-27 15:14:12浏览次数:28  
标签:TreeNode 二叉树 应用 2.2 2.1 root 节点

目录

1. 题目列表

序号 题目 难度
1 226. 翻转二叉树 简单
2 116. 填充每个节点的下一个右侧节点指针 中等

2. 应用

2.1. Leetcode 226. 翻转二叉树

2.1.1. 题目

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

image
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

2.1.2. 解题思路

2.1.2.1. 方法一:前序遍历

我们可以考虑在进入每个节点之前,在前序的位置交换每个节点的左右子树。

2.1.2.2. 方法二:后序遍历

我们也可以考虑在离开每个节点之后,在后序的位置交换每个节点的左右子树。

2.1.3. 代码实现

  • 方法一:前序遍历
class Solution {
    public TreeNode invertTree(TreeNode root) {
        return dfs(root);
    }

    private TreeNode dfs(TreeNode root) {
        if (root == null) {
            return null;
        }

        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        dfs(root.right);
        dfs(root.left);
        return root;
    }
}
  • 方法二:后序遍历
class Solution {
    public TreeNode invertTree(TreeNode root) {
        return dfs(root);
    }

    private TreeNode dfs(TreeNode root) {
        if (root == null) {
            return null;
        }

        TreeNode right = dfs(root.right);
        TreeNode left = dfs(root.left);
        root.left = right;
        root.right = left;
        return root;
    }
}

2.2. Leetcode 116. 填充每个节点的下一个右侧节点指针

2.2.1. 题目

116. 填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。

示例 1:

image
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

2.2.2. 解题思路

2.2.2.1. 方法一:广度优先搜索

2.2.2.2. 方法二:深度优先搜索

2.2.3. 代码实现


标签:TreeNode,二叉树,应用,2.2,2.1,root,节点
From: https://www.cnblogs.com/larry1024/p/17991436

相关文章

  • 受欢迎的公司是如何应用增长黑客技术的?
    ​增长黑客对初创公司来说尤其重要,因为他们没有大型老牌公司那样的资源或预算。因此,他们必须找到创新的替代方案来定位自己的增长,增长黑客策略可以让他们快速调整业务和营销战略的某些部分,以便看到他们的底线立即发生变化。这些变化通常是非常小和独特的,但可以推动业务的一些重大......
  • [office] Excel中Frequency函数统计各分数段人数的应用
    通常在在Excel中统计不同分数段或者不同的年龄段人数的方法有利用Countif(X,Y)函数和利用函数Frequency(X,Y),Fequency函数是一个频数函数,它具有统计各区间的频数的功能,使用比较简单,而且它也有两个参数,需要用英语逗号分开,第一个参数"X"是要进行统计的数据,第二个参数"Y"是分组的依据,......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一个......
  • MFC 根据定时器 ICON 移动 定时器的应用
    ▲会从做向右跑动构造函数:voidCMFCApplication1View::OnDraw(CDC*pDC){CMFCApplication1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;//绘制代码pDC->DrawIcon(x1,y1,icon[0]);pDC->DrawIcon(x2,y2+50,......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一......
  • 位运算在算法中的应用
    快速幂问题:给定整数\(a,\b,\p\)计算\(a^b\modp\)\((1\lea,b,p\le10^9)\)分析:我们可以将\(b\)转换成二进制:\[b=c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1}\]其中\(c_n\)的取值为\(0\)或者\(1\)那么有:\[a^b=a^{c_02^0+c_12^1+c_22^2+...+c_{k-1}2^{k-1......
  • 动态区间求和——树状数组的基本应用
    目录前言问题引入思路一览具体分析前言准确来说,不应该叫做动态区间求和问题,只能说树状数组经常用于求和操作而已,但是正常的动态条件查询树状数组也是可以做的,具体的下面再说吧问题引入给出一个数组a[],要求做两种操作,一种是修改数组中的一个数,一种是实现查询区间[lt,rt](lt<=......
  • 如何学习算法:什么时完全二叉树?完全二叉树有什么特点?
    完全二叉树我们知道树是一种非线性数据结构。它对儿童数量没有限制。二叉树有一个限制,因为树的任何节点最多有两个子节点:左子节点和右子节点。什么是完全二叉树?完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。完全二叉树的......
  • FluentValidation在C#的应用
    FluentValidation在C#WPF中的应用  1.引言在.NET开发领域,FluentValidation以其优雅、易扩展的特性成为开发者进行属性验证的首选工具。它不仅适用于Web开发,如MVC、WebAPI和ASP.NETCORE,同样也能完美集成在WPF应用程序中,提供强大的数据验证功能。本文将深入探讨如何在C#......
  • RIPEMD加密技术探究:优势、劣势与实战应用
    摘要:RIPEMD加密算法作为一种哈希算法,自1989年诞生以来,因其高效、安全的特性在网络安全领域得到了广泛的应用。本文将对RIPEMD算法的优缺点进行详细分析,并给出一个Java完整的示例代码。同时,本文还将列举10个实际应用场景,帮助读者更好地理解这一加密技术的实际价值。RIPEMD在线......