当前位置: 首页 > news >正文

对称二叉树 二叉树的最大深度 二叉树的最小深度

1.给定一个二叉树,检查它是否是镜像对称的。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
};
bool compare(TreeNode* left,TreeNode* right)
{
    if(left==NULL&&right!=NULL)
    return false;
    else if(left!=NULL&&right==NULL)
    return false;
    else if(left==NULL&&right==NULL)
    return true;
    else if(left->val!=right->val)
    return false;
    bool outside=compare(left->left,right->right);
    bool inside=compare(left->right,right->left);
    bool isSame=outside&&inside;
    return isSame;
    
}
bool isduichen(TreeNode* root)
{
    if(root==NULL)
    return true;
    return compare(root->left,root->right);
    
 } 
int main()
{
    TreeNode* root=new TreeNode(4);
    root->left=new TreeNode(6);
    root->right=new TreeNode(6);
    root->left->left=new TreeNode(1);
    root->right->right=new TreeNode(1);
    cout<<isduichen(root);
    return 0;
}

思路:首先我们要弄清楚比较的是根节点的左右子树,是两棵树,那么镜像对称即左子树的左孩子与右子树的右孩子相同,左子树的右孩子与右子树的左孩子相同,其实就是相当于外侧节点和内侧节点的比较。这里我们使用递归法。

因为比较的是左右子树,参数就选择左右子树节点,如果两者都存在且值相同,就向下递归比较左子树的左子树与右子树的右子树,其次递归左子树的右子树和右子树的左子树。

注意就是刚开始左右子树若均为NULL,此时该二叉树也是对称的。

2.给定一个二叉树,找出其最大深度。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
}; 
int getheight(TreeNode* root)
{
    if(root==NULL)
    return 0;
    int leftheight=getheight(root->left);
    int rightheight=getheight(root->right);
    int height=1+max(leftheight,rightheight);
    return height;
}
int main()
{
    TreeNode* root=new TreeNode(2);
    root->left=new TreeNode(3);
    root->right=new TreeNode(5);
    root->left->left=new TreeNode(6);
    root->left->right=new TreeNode(7);
    int t=getheight(root);
    cout<<t;
    return 0;
}

首先我们要搞清楚什么是高度,什么是深度,高度是指节点到叶子节点的距离,深度是指节点到根节点的距离,而这里我们要求的最大深度,就是叶子节点到根节点的距离,不就是根节点的高度吗,所以这道题看似我们求的是高度,其实是深度。

这里使用后序遍历来求深度,相当于先将左右子树的高度遍历出来,之后将这个信息传给中节点,中节点此时取两个子树中高度较大的一个,其自身再+1,那么其高度就求出来了。同时我们要知道,实际上左右子树传递的方向是从下向上,那么不就是从叶子节点出发,最终到了根节点吗,自然就把深度求出来了。

3.给定一个二叉树,找出其最小深度。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
}; 
int get_height(TreeNode* root)
{
    if(root==NULL)
    return 0;
    int left_height=get_height(root->left);
    int right_height=get_height(root->right);
    if(root->left==NULL&&root->right!=NULL)
    return 1+left_height;
    else if(root->left!=NULL&&root->right==NULL)
    return 1+right_height;
    int result=1+min(left_height,right_height);
    return result;
    
}
int main()
{
    TreeNode* root=new TreeNode(1);
    root->left=new TreeNode(4);
    root->right=new TreeNode(5);
    root->left->left=new TreeNode(8);
    cout<<get_height(root);
    return 0;
}


思路:求二叉树的最小深度就是求从根节点到最近叶子节点的最短路径上的节点数量,在这里我们尤其要考虑左右节点为空时,可不是最小深度,因为没有叶子节点,因此在有叶子节点的前提下,我们去求其深度。在这里我们使用前序遍历的方法,在根节点不为空的情况下,进行遍历,先进行对左子树的递归遍历,然后再是右子树递归遍历,最后返回最小深度,如果左右节点均不为空,返回较小深度的,如果出现左右节点为空的,就返回不为空的那一个再加1。

http://www.dtcms.com/a/64527.html

相关文章:

  • Pygame实现射击鸭子游戏3-3
  • C#结构体(Struct)详解
  • Android UI性能优化
  • 游戏辅助技术培训班课程学习【B002-中级班】
  • 以下是基于文章核心命题打造的15个标题方案,根据传播场景分类推荐
  • golang从入门到做牛马:第二十一篇-Go语言错误处理:优雅的“故障排除”
  • Tomato靶机通关攻略
  • ngrok实现内网穿透,可从外网访问本地服务
  • Spring AOP 统一问题处理
  • 【漫话机器学习系列】133.决定系数(R²:Coefficient of Determination)
  • 驻华大使夫人团探访江南铜屋 沉浸式体验中国非遗铜艺魅力
  • python机器学习theano库安装与使用
  • 本地开发MCP Server+Cline配置使用
  • 位运算刷题+总结
  • CCF-CSP备考【模拟考试系统共享】
  • 用python批量生成文件夹
  • c++介绍运算符重载九
  • 熨斗底板不平?矫平机让每寸布料都平整服帖
  • 21 | 全面测试项目功能
  • C++20 新特性总结
  • 【Vue】el-dialog的2种封装方法(父子组件双向通信),$emit触发父事件/.sync修饰符双向绑定
  • go GRPC学习笔记
  • 《鸿蒙系统下AI模型训练加速:时间成本的深度剖析与优化策略》
  • 位运算性质
  • L3-1 夺宝大赛
  • 【RAG从入门到精通系列】【RAG From Scratch 系列教程5: Retrieval】
  • 动态规划-第2篇
  • Java volatile 关键字详解
  • 华为HCIE认证用处大吗?
  • Python 字节码深度历险:dis 模块揭秘与性能优化实战