二叉树常见面试题

二叉树面试题(高频) 目录 1. 检查两颗树是否相同 1.1题目描述 1.2思考过程 1.3代码 2. 另一颗树的子树 2.1题目描述 2.2思考过程 2.3代码 3. 二叉树最大深度 3.1题目描述 3.2思考过程 3.3代码 4. 判断一颗二叉树是否是平衡二叉树 4.1题目描述 4.2思考过程 4.3代码 5. 对称二叉树 5.1题目描述 5.2思考过程 5.3代码 6.二叉树的分层遍历 6.1题目描述 6.2思考过程 6.3代码 7.二叉树的构建及遍历 7.1题目... 阅读详情
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using std::cout;
using std::cin;

  struct TreeNode {
        int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };
//题目1.后继者
//设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
class Solution1 {
public:
    void Tree(TreeNode* root, TreeNode** ret, int* n)
    {
        if (root == nullptr)
        {
            return;
        }
        Tree(root->left, ret, n);
        ret[(*n)++] = root;
        Tree(root->right, ret, n);
    }
    int TreeSize(TreeNode* root)
    {
        if (root == nullptr)
        {
            return 0;
        }
        int leftSize = TreeSize(root->left);
        int rightSize = TreeSize(root->right);
        int sum = leftSize + rightSize + 1;
        return sum;
    }
    TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
        int Size = TreeSize(root);//计算二叉树大小
        TreeNode** ret = new TreeNode * [Size];
        int n = 0;
        Tree(root, ret, &n);
        TreeNode* next = NULL;
        for (int i = 0; i < n; i++)
        {
            if (ret[i] == p && i < n - 1)
            {
                next = ret[i + 1];
            }
        }
        return next;
    }
};
//树形DP套路口诀
//(1)假设以X节点为头,假设可以向X左树和X右树要任何信息
//(2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要)
//(3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息
//(4)把左树信息和右树信息求全集,就是任何一棵子树都需要返回的信息S
//(5)递归函数都返回S,每一棵子树都这么要求

//题目2.平衡二叉树
//给定一个二叉树,判断它是否是高度平衡的二叉树。
//本题中,一棵高度平衡二叉树定义为:
//一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
int maxDepth(struct TreeNode* root) {
    if (root == NULL)
    {
        return 0;
    }
    int treeleft = maxDepth(root->left);
    int treeright = maxDepth(root->right);
    return treeleft > treeright ? treeleft + 1 : treeright + 1;
}
bool isBalanced(struct TreeNode* root) {
    if (root == NULL)
    {
        return true;
    }
    int treeleft = maxDepth(root->left);//判断左树是不是平衡二叉树
    int treeright = maxDepth(root->right);//判断右树是不是二叉树
    return abs(treeleft - treeright) < 2 && isBalanced(root->left) && isBalanced(root->right);
}
//题目3.树中节点间最远距离
//给定一棵二叉树的头节点head,任何两个节点之间都存在距离,给定一棵二叉树的头节点head,任何两个节点之间都存在距离
//返回整棵二叉树最大距离
struct Info3
{
    int MaxDistance;//记录节点中最大距离
    int height;
    Info3(int a, int b)
    {
        MaxDistance = a;
        height = b;
    }
};
class Solution3 {
public:
   
    Info3* Process3(TreeNode* head)
    {
        if (head == nullptr)
        {
            return new Info3(0, 0);
        }
        Info3* left = Process3(head->left);
        Info3* right = Process3(head->right);
        int height = fmax(left->MaxDistance, right->MaxDistance) + 1;
        int Distance = fmax(left->height + right->height + 1, fmax(left->MaxDistance, right->MaxDistance));
        delete left;
        delete right;
        return new Info3(Distance, height);
     }
    int MaxDistance(TreeNode* head)//主函数
    {
        return Process3(head)->MaxDistance;
    }
};
//题目4.最大二叉搜索
//给定一棵二叉树的头节点head,
//返回这颗二叉树中最大的二叉搜索子树的节点数量
struct Info4
{
    bool isALLBST;//是否是二叉搜素树
    int max;//记录最大节点
    int min;//记录最小节点
    int Sum;//最大二叉搜索树的节点个数
    Info4(bool s, int _max, int _min, int _Sum)
    {
        isALLBST = s;
        max = _max;
        min = _min;
        Sum = _Sum;
      
    }
};
class Solution4
{
public:
    Info4* Process4(TreeNode* head)
    {
        if (head == nullptr)
        {
            return nullptr;
        }
        Info4* left = Process4(head->left);
        Info4* right = Process4(head->right);
        int max = head->val;
        int min = head->val;
        if (left != nullptr)
        {
            max = fmax(max, left->max);
            min = fmin(min, right->min);
        }
        if (right != nullptr)
        {
            max = fmax(max, right->max);
            min = fmin(min, right->min);
        }
        bool s = false;//默认不是二叉搜素树
        int sum = 0;
        if (left != nullptr)
        {
            sum = left->Sum;
        }
        if (right != nullptr)
        {
            sum = right->Sum;
        }
        if (left == nullptr ? true : (left->isALLBST)
            && right == nullptr ? true : (right->isALLBST) 
            && left == nullptr ? true : (left->max<head->val)
            && right == nullptr ? true : (right->min>head->val)
            )
        {
            s = true;
            sum = (left == nullptr ? 0 : left->Sum) + (right == nullptr ? 0 : right->Sum) + 1;
           
        }
        delete left;
        delete right;
        return new Info4(s, max, min, sum);
    }
    int MaxBstSize(TreeNode* head)
    {
        return Process4(head)->Sum;
    }
};
//题目5.判断满二叉树
//给定一个数的头结点,返回这棵树是不是满二叉树
//技巧:满二叉树符合2^高度-1 = 节点个数
struct Info5
{
    int height;//记录树的高度
    int Sum;//记录节点的个数
    Info5(int _height, int _Sum)
    {
        height = _height;
        Sum = _Sum;
    }
};
class Solution5
{
public:
   Info5* Process5(TreeNode* head)
    {
       if (head == nullptr)
       {
           return new Info5(0, 0);
       }
       Info5* left = Process5(head->left);
       Info5* right = Process5(head->right);
       int height = fmax(left->height, right->height) + 1;
       int Sum = left->Sum + right->Sum + 1;
       delete left;
       delete right;
       return new Info5(height, Sum);
       }
   bool IsAllTree(TreeNode* head)
   {
       Info5* s = Process5(head);
       bool f = pow(2, s->height) == s->Sum;
       delete s;
       return f;
   }
};
二叉树常见面试题汇总 1.先序/中序/后序遍历二叉树(递归非递归实现),层序遍历二叉树遍历2.求二叉树的高度size_t Height()//获取该树的高度 { return _Height(_pRoot); } size_t _Height(Node* pRoot)//获取数树的深度,根节点为1 { if(pRoot==NULL) 阅读详情

相关推荐

二叉树的常见笔试面试题

在二叉树的基本操作里已经说明如何用递归的方法进行二叉树的遍历,那么如何用非递归的方法来进行二叉树的遍历呢,请看下文1.使用非递归方式进行二叉树的先序遍历![这里写图片描述](//img-blog.youkuaiyun.com/20180429152827371?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L05lc3NpZV96aGFv/font/5a6L5L2T/fontsiz...

Nessie_zhao的博客 5171

十道二叉树面试题,对二叉树理解更进一步

学习二叉树有一个很重要的思想就是分治(将一个大问题划分为最小规模的子问题),常用方法之一就是递归,而递归是很抽象的,当对递归过程不理解时,建议多画图将递归过程实例化,拒绝人脑压栈...

weixin_46016019的博客 3460

ComfyUI实战:AnimateDiff与ControlNet结合,打造无缝风格化视频转绘

本文详细介绍了如何利用ComfyUI平台,结合AnimateDiff与ControlNet插件,实现高质量的视频风格化转绘。通过搭建节点工作流、调整关键参数,有效解决画面闪烁与失真问题,并分享了进阶玩法与常见问题解决方案,帮助用户轻松打造流畅、风格统一的动态视觉效果。

weixin_29039773的博客 336

二叉树精选面试题

记录了自己在学习数据结构的过程中刷的题,一棵树的子树,翻转二叉树,平衡二叉树,对称二叉树,平衡二叉树,最近公共祖先等等

2202_76097976的博客 2108

OJ(while+cin.get()判断结束)

今天要记录一道看起来十分简单的OJ题目,但开始对于cin的一些操作忘得差不多了,没做出来,故记下来给自己提个醒。 描述 给出包含N个单词的一行输入,输出N行。第一行和输入一样。每次输出过一行后,这一行的第一个单词在下一行被放到最后。 输入 包含N个单词的字符串,单词以一个空格分开。N不在输入中给出,你需要计算单词的数量来获得。字符串包含的字符数小于100。 输出 输出N行。...

Stark_JC的博客 2357

pgAdmin4备份恢复实战:从安装到避坑指南

本文提供了一份详尽的pgAdmin4备份恢复实战指南,涵盖从安装配置到执行备份恢复的全流程。针对Windows环境下的浏览器兼容性、二进制路径配置等常见问题,给出了具体解决方案。重点强调了使用pgAdmin4进行备份恢复的可靠性,特别是在处理包含PostGIS等扩展的数据库时,能有效避免数据类型和权限错误,确保数据迁移的完整性与安全性。

weixin_29266007的博客 439

【数据结构】二叉树面试题总结(持续更新中...)

总结了二叉树的相关习题。

weixin_44258092的博客 1733

ESP32水墨屏日历实战:低功耗自动更新与HTTPS数据解析

本文详细介绍了ESP32水墨屏日历项目的开发实践,重点讲解了低功耗自动更新与HTTPS数据解析的实现方法。通过ESP32的自动休眠功能和水墨屏的零功耗特性,结合HTTPS请求安全获取网络数据,实现了高效节能的桌面日历应用。项目代码开源,适合物联网开发者参考。

xx56789的博客 777

【数据结构】二叉树常见面试题

1、创建二叉树 树的结构如下: 这里我们创建二叉树用的是静态创建即不是每次从标准输入读入数据然后插入树中,而是将定义好的一个序列,也就是一个数组构建一棵树,这里采用的是递归创建,首先来看一下参数,首先传进来的就是根结点,然后是要构建树的序列然后是数组下标索引,负责遍历整个数组,然后是数组的大小,然后是无效值,遇到无效值表示当前结点为空,就返回上一层函数调用,递归程序的出口是index...

如风逝去 6330

基于Python的携程景点评价爬虫与情感评分分析

摘要: 本项目通过Python技术栈实现携程景点评论的情感分析系统,包含数据爬取、文本预处理、情感评分和可视化分析全流程。使用requests抓取评论接口,jieba进行中文分词,SnowNLP计算情感得分(0-1),并通过词云、情感分布图呈现结果。典型分析显示72%评论为正面,负面反馈多涉及"排队久""票价贵"等问题。系统可辅助景点口碑管理,扩展方向包括多景点对比、BERT模型优化等。项目强调需遵守爬虫伦理,控制请求频率,适用于非商业用途的旅游数据分析。(150字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 977

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

二叉树中的那些常见的面试题

关于二叉树 二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。昨天看了一下关于树中的面试题,发现二叉树中的面试题比较常见的题型大概有下面几个:创建一颗二叉树(先序,中序,后序)、遍历一颗二叉树(先序,中序,后序和层次遍历)、求二叉树中叶子节点的个数、求二叉树的高度、求二叉树中两个节点的最近公共祖先、打印和为某一值的全部路径、求某一节点是否在一个树中等等。 再详细的说这些面试题之...

450

基于STM32F1XX 、HAL库的BH1745NUC-E2环境光传感器驱动应用C语言程序设计

printf("BH1745制造商ID: 0x%02X\r\n", BH1745_ReadManufacturerID(&hbh1745));#define BH1745_ADDR_HIGH 0x39 // ADDR引脚接VDD。#define BH1745_ADDR_LOW 0x38 // ADDR引脚接地。= 0xE0) // BH1745制造商ID为0xE0。// 清除RGBC测量使能位。printf("BH1745初始化失败\r\n");

PP_Cottage的博客 280

二叉树的操作及常见面试题

二叉树的概念及性质本文将附上博主自己手动实现的二叉树常见的各种操作以及归纳总结一下常见的基础面试题。😁😁😁😁。

VIBE的博客 1170

(九)DFI接口时序

文章目录一、DFI Interface 一、DFI Interface   DFI接口是连接DDR Controller与DDR_PHY之间的通用接口,其信号组如下表:       

Mr.翟的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

二叉树中的那些常见的面试题(转)

二叉树中的那些常见的面试题 关于二叉树 二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。昨天看了一下关于树中的面试题,发现二叉树中的面试题比较常见的题型大概有下面几个:创建一颗二叉树(先序,中序,后序)、遍历一颗二叉树(先序,中序,后序和层次遍历)、求二叉树中叶子节点的个数、求二叉树的高度、求二叉树中两个节点的最近公共祖先、打印和为某一值的全部路径、求某一节点是否...

weixin_30555515的博客 65

Statistics and Machine Learning Toolbox

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

二叉树常见面试题集合

import java.util.LinkedList; import java.util.Queue; import java.util.Stack; /** * 二叉树刷题集锦 */ class TreeNode{ int val; TreeNode left; TreeNode right; public TreeNode(){} publi...

pharos的博客 248

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【二叉树OJ】常见面试题

一些常见二叉树的题目的讲解

Yui_的博客 1389
上一篇: 常见链表面试题总结
下一篇: 二叉树序列化与反序列化(leetcode(困难))
1无名之辈1
博客等级 码龄5年 4674粉丝 46原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1无名之辈1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值