二叉树面试题

2023-10-31

将二叉查找树变为有序双向链表:

        考虑,二叉查找树的特点是左子树比根节点小,根节点又比右子树小。所以要把二叉查找树变为有序的双向链表,就要把左子树连接到它的前一个结点,右子树作为后一个结点,递归的进行下去。如图所示:


问题解决:

        按照中序遍历二叉树,如果根节点为空,直接返回;

        如果左子树为空,修改它的左指针指向上一次访问的结点(*last)(由于是中序遍历,上一次访问的结点就是前一个结点);否则递归的处理该节点的左子树;

        判断上一个结点(*last)是否为空,若为空,直接赋值为当前结点;否则,将(*last)的右指针指向当前结点的同时更新*last;

        最后,如果右子树不为空,递归的处理右子树。

代码实现:

void ConvertTree(TreeNode* root, TreeNode** last)
{
    if(root == NULL)                                                                                                                 
        return;
    if(root->lchild != NULL)
        ConvertTree(root->lchild, last);
    root->lchild = *last;
    if(*last != NULL)
        (*last)->rchild = root;
    (*last) = root;
    if(root->rchild != NULL)
        ConvertTree(root->rchild, last);
    return;
}

判断两树是否结构相同:

问题解决:

1.若两树都为空,返回1;

2.若一个为空,一个不为空,返回0;

3.递归的进行判断左子树和右子树,返回与结果。

代码实现:

int IsOneStruct(TreeNode* root1, TreeNode*root2)
{
    if(root1 == NULL && root2 == NULL)
        return 1;
    else if(root1 == NULL || root2 == NULL)
        return 0;
    return IsOneStruct(root1->rchild, root2->rchild) && IsOneStruct(root1->lchild, root2->lchild);
}

判断一个树是否是平衡二叉树:

问题解决:

平衡二叉树数每个子树的左右高度差不超过一。设置一个输出型参数记录每个树的高度,

若该树为空,返回1,同时令高度为0;

否则,利用递归判断左右子树是否为平衡二叉树,

    若左右子树均为平衡二叉树,且高度差小于等于1,返回1.

int IsAVLTree(TreeNode* root, int* height)
{
    if(root == NULL)
    {                                                                                                                                
        (*height) = 0;
        return 1;
    }   
    int rresult, lresult;
    //分别记录左右子树高度
    int lheight;
    int rheight;
    rresult = IsAVLTree(root->rchild, &rheight);
    lresult = IsAVLTree(root->lchild, &lheight);
    *height = lheight > rheight ? lheight+1 : rheight+1;
    if(abs(rheight - lheight) <= 1 && rresult && lresult)
        return 1;
    else
        return 0;
}                                                                                                                                    

寻找公共祖先结点:

int FindNode(TreeNode* root, TreeNode* node)
{
    if(root == NULL)                                                                                                                 
        return 0;
    if(root == node)
        return 1;
    if(root->lchild == node || root->rchild == NULL)
        return 1;
    return FindNode(root->lchild, node) || FindNode(root->rchild, node);
}
TreeNode* FindCommonParent(TreeNode* root, TreeNode* node1, TreeNode* node2)
{
    if(root == NULL)
        return NULL;
    if((FindNode(root->rchild, node1)&&(FindNode(root->lchild, node2))) || ((FindNode(root->lchild, node2)&&FindNode(root->rchild, no
    {
        return root;
    }                                                                                                                                
    TreeNode* r1 = FindCommonParent(root->rchild, node1, node2);
    TreeNode* r2 = FindCommonParent(root->lchild, node1, node2);
    return r1 != NULL ? r1 : r2;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树面试题 的相关文章

  • WebSocket 长连接 及超时问题解决

  • JAVA的extends用法

    理解继承是理解面向对象程序设计的关键 在Java中 通过关键字extends继承一个已有的类 被继承的类称为父类 超类 基类 新的类称为子类 派生类 在Java中不允许多继承 1 继承 class Animal void eat Syste
  • TextView自动适配文本大小的几种方案

    标题太难取了 其实本文主要就是讲如何控制文本大小 让其自动适配宽度 其次我们还需要精准控制Text的高度和宽度间距等属性 一般我们的布局都是分 match parent 和 wrap content 而他们的自动方式又有所不同 下面看看都有
  • 攻防世界-ics-05题

    ics 05题 php伪协议 题目分析 preg replace函数漏洞 php伪协议 常用方式 file php filter read convert base64 encode resource index php 用来查看index
  • 服务器向客户端传文件失败怎么办,服务器可以向客户端传文件

    服务器可以向客户端传文件 内容精选 换一换 用于IDE daemon host 作为服务端 和IDE daemon client 作为客户端 之间的双向认证 在Atlas 300场景下 IDE daemon host部署在Host侧 若不安

随机推荐

  • 动态规则表达式解析

    import cn hutool core util StrUtil import com alibaba fastjson JSONArray import com alibaba fastjson JSONObject import j
  • 计算机视觉技术在图像特征提取中的应用研究,计算机视觉防撞系统中图像特征提取算法研究...

    摘要 智能车辆系统 IVS Intelligent Vehicle System 是近年来新兴的一门交叉学科 其研究涉及到计算机测量与控制 计算机视觉 传感器数据融合 车辆工程等诸多领域 可以说 智能车辆的研究是计算机视觉与计算机控制在车辆
  • [Vue面试] keep-alive 和 $set 的使用

    keep alive 的使用汇总于 半度 温热 和 圈圈同学 keep alive 概念 keep alive 是 Vue 的内置组件 当它包裹动态组件时 会缓存不活动的组件实例 而不是销毁它们 和 transition 相似 keep a
  • vite性能优化提升开发体验之hmr和预编译

    一 vite中的预编译 1 预编译概念介绍 Vite 一个由Vue js开发者尤雨溪开发的新型前端构建工具 主要利用了现代浏览器支持的ESM ES模块 来进行快速开发 Vite在法语中意为 快 其中最大的亮点就是其开发服务器启动的速度 能够
  • PostgreSQL基本操作总结

    安装按PostgreSQL数据库后 会默认创建用户postgres和数据库postgres 这个用户是超级用户 权限最高 可以创建其他用户和权限 在实际开发过程中 会新创建用户和业务数据库 本文主要介绍用户权限和数据库的基本操作 1 用户权
  • SQL 在Join 和 Exists查询时对Null 值的处理

    文章目录 Join 中 null 值的处理 In 和 Exists 中 null 值的处理 Join 和 Exists 测试 准备测试数据 Join 测试 In 和 Exists 测试 最近发现SQL在处理Join 和 父子查询的时候 会对
  • 在Springboot使用form上传图片作为头像,之后通过ajax渲染img的src属性显示图片遇到的路径问题处理小技巧

    业务流程大概是这样的 在Springboot框架下 使用form提单提交用户注册信息 包括图片 图片被保存到服务器上 把图片保存的路径作为属性存入数据库 之后 显示用户信息的时候 通过Ajax获取用户信息 将图片的路径赋值给 img 的sr
  • ES Model 简述

    ES Module 浏览器中使用 html 中使用 在 html 中 script 标签添加 type module 表示可以以 ES Module 的标准执行其中的 JS 代码 ESM 自动采用了严格模式 忽略 use strict 每个
  • 分布式训练数据并行极致优化:ZeRO

    分布式训练数据并行极致优化 ZeRO 导言 随着 ChatGPT 的爆火 大模型成为了近些年人工智能的研究热点 大模型能力惊艳 但是训练起来成本也不小 大模型 顾名思义 最大的特点就是 大 这里的 大 通常指的就是模型的参数量大 因此 在分
  • mysql truncate 多个_mysql生产批量处理数据 比如批量truncate ..

    背景 工作中涉及到经常要为QA同学批量清空表记录 这里记录一下我的操作过程和遇到的问题 最后做一下小结 过程 拼SQL 这个很简单 用 CONCAT 从 information schema 里面获取 TABLE NAME 拼成要执行的一句
  • Java:Spring的IOC原理(大白话解释)

    先行参考以下半成品文章和参考链接 待学完课程后续整理此文章 IOC和DI关系 IOC Inversion of Control 控制反转 DI Dependency Injection 依赖注入 关系 IOC是一种面向编程设计思想 DI是I
  • 远程仓库上创建一个新的分支 `b` 并将远程分支 `a` 的内容克隆到 `b` 分支上

    一 需求 要在远程仓库上创建一个新的分支 b 并将远程分支 a 的内容克隆到 b 分支上 你可以按照以下步骤进行操作 二 解决方案 1 首先 使用 git clone 命令克隆远程仓库到本地 例如 要克隆一个名为 repo 的仓库 可以运行
  • 一个简单的Java抽奖程序

    文章目录 需求背景 设计思路 代码实现 定义奖品及中奖概率 执行抽奖 中奖率测试 测试结果数据 本文逻辑思想比较简单 旨在了解后端如何设计抽奖以及控制抽奖概率 需求背景 现在奖品池有如下奖品 序号 名称 中奖率 0 代金券10元 20 1
  • uniapp使用svg图片的优化方案

    问题 uniapp使用svg图片 浏览器测试可以显示出来 真机测试无法显示 为了解决手机无法显示svg图标的问题 本人特意开发了一款插件 如有不足请各位指出 勿喷 svg icon DCloud 插件市场 替换方案 使用字体图标 1 打开下
  • Sublime Text 常用插件安装介绍,从入门到精通(图文系列二)

    不懂Sublime Text基础下载安装的请先看这篇 Sublime Text下载 安装和Package Control的安装方法 在安装Package Control之后我们就可以开启Sublitme Text插件的之路啦 下边在这简单的
  • 动手学CV-目标检测入门教程2:VOC数据集

    3 2 目标检测数据集VOC 本文来自开源组织 DataWhale CV小组创作的目标检测入门教程 对应开源项目 动手学CV Pytorch 的第3章的内容 教程中涉及的代码也可以在项目中找到 后续会持续更新更多的优质内容 欢迎 如果使用我
  • 使用YOLOV5训练自己的数据集时所遇到问题

    训练过程中 1 attributeerror module yaml has no attribute load 方法1 如果另一个名为 yaml py 的文件在 PyYaml 库之前出现在你的 sys path 中 就会接收并导入该 ya
  • ubuntu安装docker

    sudo apt get remove docker docker engine docker io containerd runc sudo apt get update sudo apt get install apt transpor
  • 强化学习中累积奖赏公式的推导

    转载于 强化学习中累积奖赏公式的推导 qingtian11112的博客 CSDN博客 强化学习累计奖励 1 一些符号解释 P C D 表示条件概率 在D发生的条件下 C发生的概率 E C D 表示在D发生的条件下 求C的期望 即有 X 表示
  • 二叉树面试题

    将二叉查找树变为有序双向链表 考虑 二叉查找树的特点是左子树比根节点小 根节点又比右子树小 所以要把二叉查找树变为有序的双向链表 就要把左子树连接到它的前一个结点 右子树作为后一个结点 递归的进行下去 如图所示 问题解决 按照中序遍历二叉树