二叉树算法集锦

【算法题集锦之四】--算术表达式转二叉树并还原 算术表达式,即由数字和运算符号组成的式 阅读详情

1.判断平衡二叉树

public class Solution {
    public boolean IsBalanced_Solution(TreeNode root){
        boolean[] res = new boolean[1];
        res[0] = true;
        getHeight(root,1,res);//注意传数组,不能传res[0]
        return res[0];
    }

    private int getHeight(TreeNode head, int level, boolean[] res) {
        if(head==null){
            return level;
        }
        int lH=getHeight(head.left,level+1,res);//求左子树高度
        if(!res[0]){//求左子树高度的过程中,发现不平衡,此函数立即返回,递归过程结束,此时返回什么根本不重要
            return level;
        }
        int rH=getHeight(head.right,level+1,res);
        if(!res[0]){
            return level;
        }
        if(Math.abs(lH-rH)>1){//左右子树都平衡,比较高度差
            res[0]=false;
        }
        return Math.max(lH, rH);
    }
}

2.判断对称二叉树

   //判断是否是对称的二叉树
    public static boolean isSymmetrical(Node root){
        if(root==null){
            return true;
        }
        return isSymmetrical(root.left,root.right);
    }

    private static boolean isSymmetrical(Node n1, Node n2) {
        if(n1==null&&n2==null){
            return true;
        }
        if(n1==null||n2==null){
            return false;
        }
        if(n1.value!=n2.value){
            return false;
        }
        return isSymmetrical(n1.left, n2.right)&&
                isSymmetrical(n1.right,n2.left);
    }

3.求二叉树的镜像

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public void Mirror(TreeNode root) {
        if(root == null) return;//空树或者只有一个节点的树,直接返回
        if(root.left == null && root.right == null) return;

        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;

        if(root.left != null) Mirror(root.left);
        if(root.right !=null) Mirror(root.right);
    }
}

4.任意两个节点的最近公共祖先

从根节点开始遍历,如果node1和node2中的任一个和root匹配,那么root就是最低公共祖先。 如果都不匹配,则分别递归左、右子树,如果有一个 节点出现在左子树,并且另一个节点出现在右子树,则root就是最低公共祖先. 如果两个节点都出现在左子树,则说明最低公共祖先在左子树中,否则在右子树。

public class Solution {  
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {  

        if(root == null || root == p || root == q) return root;  //发现目标节点则通过返回值标记该子树发现了某个目标结点  
        TreeNode left = lowestCommonAncestor(root.left, p, q);   //查看左子树中是否有目标结点,没有为null  
        TreeNode right = lowestCommonAncestor(root.right, p, q);   //查看右子树是否有目标节点,没有为null  

        if(left!=null&&right!=null) return root;    //都不为空,说明做右子树都有目标结点,则公共祖先就是本身  
        return left == null ? right : left;  //如果发现了目标节点,则继续向上标记为该目标节点  
    }  
}

5.将搜索二叉树构建成双向链表

递归版
解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {


    public TreeNode Convert(TreeNode root) {
        if(root==null)
            return null;
        if(root.left==null&&root.right==null)
            return root;

        // 将左子树构造成双链表,并返回链表头节点
        TreeNode left = Convert(root.left);
        TreeNode p = left;

        while(p!=null&&p.right!=null){
            p = p.right;
        }
        if(left!=null){
            p.right = root;
            root.left = p;
        }

        TreeNode right = Convert(root.right);
        if(right!=null){
            right.left = root;
            root.right = right;
        }
        return left!=null?left:root;       
    }
}
二叉树的实现各种遍历算法 二叉树的实现各种遍历算法,插入删除成员函数非常全。二叉树的实现各种遍历算法,插入删除成员函数非常全 立即下载

相关推荐

Mac用户必看:Parallels Desktop 18.1.1最新破解版安装与优化全攻略(附资源)

本文为Mac用户提供Parallels Desktop 18.1.1的详细安装与优化指南,涵盖虚拟化技术选型、专业级配置流程及性能调优技巧。重点解析Parallels Desktop在图形加速、系统资源调度方面的核心优势,并分享生产力增强技巧与典型应用场景实战方案,帮助用户最大化利用这一高效虚拟化工具。

weixin_29240343的博客 818

【算法】二叉树常见算法

二叉树常见的算法题,单值二叉树、相同的树、对称二叉树、另一棵树的子树、判断完全二叉树共5种

weixin_52811588的博客 2614

MaPLe: Multi-modal Prompt Learning

具体而言,我们在语言分支中附加可学习的上下文标记,并通过耦合函数显式地将视觉 Prompt 置于语言 Prompt 上,以建立它们之间的交互。使用 Prompt 来适应CLIP (语言或视觉) 的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。由此,提出了一种分支感知的多模态 Prompt,通过在两种模态之间共享提示来协调 CLIP 的视觉和语言分支。在 Prompt Tuning 中,必须采取多模态方法获得同时适应 CLIP 的视觉和语言分支,以实现上下文优化的完整性。

weixin_48907099的博客 1051

二叉树相关算法汇总(详细)

二叉树基本知识 二叉树(Binary Tree)是n(n≥0)个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。 二叉树常见概念: 结点的度。结点所拥有的子树的个数称为该结点的度。 叶子结点。度为0的结点称为叶子结点,或者称为终端结点。 分支结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶子结点外,其余的都是分支结点。 左孩子、右孩子、双亲。树中一个结点的子树的根结点称为这个结

泛泛之素 1万+

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2383

MuJoCo与Isaac Sim的无缝对接:利用USD导出功能实现强化学习场景的跨平台迁移

本文详细介绍了如何通过USD导出功能实现MuJoCo与Isaac Sim的无缝对接,助力强化学习场景的跨平台迁移。文章解析了USD格式的核心优势,包括分层合成、物理属性继承和时间轴动画,并提供了从MJCF到USD的完整转换流程及在Isaac Sim中的高级应用技巧,帮助开发者高效迁移和优化强化学习环境。

weixin_29073241的博客 515

经典算法:二叉树相关的算法集合

给出二叉树的相关算法,包括二叉树的递归创建,非递归遍历,二叉树的高度,层序遍历二叉树。

elliptical的专栏 2140

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3157

二叉树算法解题思路总结(一)

第一步:先考虑用递归的方式解决问题,注意递归的终止条件。有的递归需要用到回溯法和全局变量 第二步:如果递归无法解决问题,考虑迭代法,具体的迭代方式参考层序遍历和非递归遍历 本篇文章只介绍第一步相关的内容,题目来自leetcode和牛客网的剑指offer 一、找结点 1.二叉搜索树的最近公共祖先:leetcode236 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百...

meihuai7538的博客 2610

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 561

C# MES通信从入门到精通(10)——C#使用HTTP的Post和Get方法和Mes系统通信

本文详细介绍了如何利用C#完成与HTTP协议的MES系统进行通信,通过POST和GET方法实现与MES系统的交互,由高级工程师的实战经验总结,实属C#与MES通信领域的葵花宝典!

qq_34059233的博客 3413

二叉树的基本算法

二叉树的先序遍历 就是每棵子树,都是先出现头结点、再左子树、再右子树。 递归序列!!! 一定会到达这个Node节点三次,也表明了有三个位置进行Node数据的处理,前中后 每个节点都是这样。 先序就是第一次到达某个节点就打印 中序就是第二次到达某个节点就打印 后序就是第三次到达某个节点再打印。 二叉树可以先去左边树上转一圈,再回到中间节点,再去右边树上转一圈,可以进行信息的整合。 f(Node) { if(Node==NULL) return; // 1 ...

weixin_38216573的博客 1464

ZYNQ 使用AXI_BRAM实现PS与PL 数据交互数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过Block RAM实现。通过Zynq 的GP Master 接口读写PL端的 BRAM,实现PS与PL的交互。加入自定义的 FPGA 程序,并利用 AXI4 总线进行配置,通知何时读写 BRAM。CPU通过 AXI BRAM Controller 读取 BRAM 数据,CPU 仅配置自定义的 PL BRAM Controller 的寄存器,不通过它读写数将BRAM与socket进行联合使用,将电脑的数据发到PS端,PS端放在PL端,PL端再发给PS端,P据。

wangjie36的博客 1万+

C++算法集锦:二叉树的基本操作

二叉树的基本操作

1291

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【数据结构】二叉树经典入门算法题集锦(上)

前言:本章将通过六道来自LeetCode/牛客网中的二叉树相关算法题来介绍数据结构中二叉树在算法题中的应用。 文章目录1.单值二叉树思路分析:题解:2.二叉树的前序遍历思路分析:题解:3.相同的树思路分析:题解:4.对称二叉树思路分析:题解:5.另一棵子树思路分析:题解:6.二叉树遍历思路分析:题解: 1.单值二叉树 OJ链接 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 思路分析: 我们知道“”具有传递性

林慢慢的博客 1703

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【数据结构】二叉树经典入门算法题集锦(下)

前言:本章将通过五道来自LeetCode/牛客网中的二叉树相关算法题来介绍数据结构中二叉树在算法题中的应用,题目难度不大,大家就当放松放松。 文章目录1.二叉树的最大深度思路分析:题解:2.平衡二叉树思路分析:题解:3.二叉树的后序遍历思路分析:题解:4.二叉树的中序遍历思路分析:题解:5.翻转二叉树思路分析:题解: 1.二叉树的最大深度 OJ链接 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 思路分析: 二叉树的最大深度等价于:左右子树的最大深度

林慢慢的博客 2178

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

面试题目汇总(JAVA算法/数据结构)

1.题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 代码: import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u

小马的博客 2万+

算法题目记录

【代码】算法题目记录。

qq_64064246的博客 1016

数据结构与算法部分

给最外层的rootview,把这个根视图下的全部button背景设置成红色,手写代码,不许用递归 给一串字符串比如abbbcccd,输出a1b3c3d1,手写代码(注意有个别字符可能会出现十次以上的情况) 一个序列,它的形式是12349678,9是最高峰,经历了一个上升又下降的过程,找出里面的最大值的位置,要求效率尽可能高 二叉查找树的删除操作,手写代码 反转链表,手写代码 二分查找,手写代码 有海

yanghaitao的博客 1177

决战秋招笔试:leecode题型分类索引

栈和队列 链表 二叉树 递归和动态规划 字符串 大数据和空间限制 位运算 数组和矩阵 ———————————————————————————— 滑动窗口 排列 区间重叠 字典树 宽度优先搜索 深度优先搜索 二分搜索 哈希 堆 并查集 贪心 数学 其它

Ljunyu的博客 355

数据结构和算法面试总结

1、反转一个链表。循环算法。  List reverse(List l) {  if(!l) return l;  list cur = l.next;  list pre = l;  list tmp;  pre.next = null;  while ( cur ) {  tmp = cur;  cur = cur.next;  tmp.next = pre  pre =

玮哥的博客 1万+

java 有序数组 频率,高频算法题解 java

替换空格public void replaceSpace(){String s="abc de f ";String t= s.replace(" ","%20");System.out.println(t);}顺时针打印矩阵import java.util.ArrayList;import java.util.List;public class SpiralMatrix {public List...

weixin_39825722的博客 153

Java数据结构、算法面试题

转自https://blog.youkuaiyun.com/zyx520ytt/article/details/72466255 1.题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 代码: import java.util.ArrayList;import java.ut...

无知是恶 3342

算法学习参考网址

http://blog.youkuaiyun.com/llingy/article/details/5674250搜索算法集锦 http://wenku.baidu.com/view/6303a46c02020740be1e9b8a.html  算法经典案例(C语言) http://www.cnblogs.com/ziyi--caolu/p/3581337.htmlhdu 4253(经典题目:二分+最小生

u013240812的专栏 414

助你快速踏入高薪职场——2017面试集锦之算法与编程

算法与编程 1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。      答: packagecn.itcast; import java.io.File; import java.io.FileReader; import java.io.FileWriter; p

宇翔XGT的博客 328

2024年最全《剑指offer》之从上往下打印二叉树,java程序员面试笔记pdf

金三银四到了,送上一个小福利!本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取dn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**需要这份系统化的资料的朋友,可以点击这里获取。

2401_84003554的博客 275
上一篇: 关于递归思想
下一篇: 根据除以3的结果调整数组
ka_ko
博客等级 码龄11年 168粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值