牛客网《剑指offer》专栏刷题练习之二叉树合集

简介: 牛客网《剑指offer》专栏刷题练习之二叉树合集

1、二叉树的下一个结点


1.1、题目速览




1.2、个人题解


1.2.1、解题思路


1. 我们首先要根据给定输入中的结点指针向父级进行迭代,直到找到该树的根节点;


2. 然后根据根节点进行中序遍历,当遍历到和给定树节点相同的节点时,下一个节点就是我们的目标返回节点


具体步骤:


根据当前结点,利用题目所给条件找到根结点

书写中序遍历的函数,传入根结点

将中序遍历的结点储存在结点数组里

将传入的二叉树结点与数组元素匹配,返回数组的下一个元素


1.2.2、代码实现


/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
    }
};
*/
class Solution {
public:
    vector<TreeLinkNode*>nodes;
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        TreeLinkNode* root=pNode;
        //利用父指针找到根结点
        while(root->next)    
            root=root->next;
        //调用中序遍历
        InOrder(root);
        int num=nodes.size();
        for(int i=0;i<num;i++){
            TreeLinkNode *cur=nodes[i];
            if(pNode==cur){
                return nodes[i+1];
            }
        }
        return NULL;
    }
    //书写中序遍历
    void InOrder(TreeLinkNode* root){
        if(root==NULL) return;
        InOrder(root->left);
        nodes.push_back(root);
        InOrder(root->right);
    }
};


1.2.3、代码解析


首先创建动态数组nodes,注意是创建在方法外部,目的是可以在类内任意使用

创建的root结点并借助while循环通过父指针next找到根结点

书写InOrder中序遍历函数,将中序遍历结果存入上方创建的nodes数组中

使用for循环将传入结点pNode与数组元素比较,如果匹配到就返回位置加一的结点


2、对称的二叉树


2.1、题目速览




2.2、个人题解


2.2.1、解题思路


前序遍历的时候我们采用的是“根左右”的遍历次序,如果这棵二叉树是对称的,即相应的左右节点交换位置完全没有问题;

那我们是不是可以尝试“根右左”遍历,按照轴对称图像的性质,这两种次序的遍历结果应该是一样的。

但是如果相同的方式进行两次,可行但我们不去做,这对时间的消耗太多了,我们不如在遍历的过程就结果比较了。而遍历方式依据前序递归可以使用递归:


两种方向的前序遍历,同步过程中的当前两个节点,同为空,属于对称的范畴。

当前两个节点只有一个为空或者节点值不相等,已经不是对称的二叉树了。

第一个节点的左子树与第二个节点的右子树同步递归对比,第一个节点的右子树与第二个节点的左子树同步递归比较。


2.2.2、代码实现


/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot) {
        return dgfunc(pRoot,pRoot);
    }
    bool dgfunc(TreeNode* root1,TreeNode* root2){
        if(root1==NULL&&root2==NULL)
            return true;
        if(root1==NULL||root2==NULL||root1->val!=root2->val)
            return false;
        return dgfunc(root1->left, root2->right) && dgfunc(root1->right,root2->left);
    }
};

2.2.3、代码解析


编写dgfunc函数,将pRoot传入比较

前两个if是递归结束的条件:

如果结点相同返回true

如果一边为NULL或者左子树与右子树不同,返回false

调用递归,比较左右子树,都相同就返回true,不相同则返回false

相关文章
|
消息中间件 存储 网络协议
ZMQ/ZeroMQ简介
ZMQ/ZeroMQ简介
|
Java Apache Maven
HttpClientConnectionManager哪个版本里有?
【8月更文挑战第25天】HttpClientConnectionManager哪个版本里有?
504 2
|
存储 数据采集 自然语言处理
知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等
知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等
知识图谱之《海贼王-ONEPICE》领域图谱项目实战(含码源):数据采集、知识存储、知识抽取、知识计算、知识应用、图谱可视化、问答系统(KBQA)等
|
Web App开发 资源调度 网络协议
RTS 与 FreeSWITCH
这篇文章介绍了RTS(Real-Time Switch),一个FreeSWITCH的衍生品,它提供了稳定发行版、实用默认配置、新特性、国产化适配、改进的控制接口和UI等,同时讨论了RTS的默认编译模块调整、禁用Stun功能、增加的RTP相关函数、WebRTC Media Bundle支持、HTTP相关函数增加、默认禁用自动NAT、Windows编译问题解决、录音文件权限修改、mod_httapi和mod_logfile模块优化,以及文档贡献和国内访问GitHub的方法。
383 0
|
算法 安全 Java
在Java中实现数据加密和解密
在Java中实现数据加密和解密
|
机器学习/深度学习 编解码 异构计算
ELAN:用于图像超分辨率的高效远程注意力网络
ELAN:用于图像超分辨率的高效远程注意力网络
579 1
|
机器学习/深度学习 搜索推荐 Python
L2范数(L2 norm)
L2范数(L2 norm),也称为欧几里德范数(Euclidean norm)或2-范数,是向量元素的平方和的平方根。它在数学和机器学习中经常被用作一种正则化项、距离度量或误差度量。
10730 76
|
Ubuntu 编译器 Linux
交叉编译工具链安装
交叉编译工具链安装
1125 0
|
SQL 缓存 搜索推荐
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表结构保持最新。
1646 0
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
|
数据可视化 算法 搜索推荐
再也不怕冒泡排序了,看完这篇Go语言详解就会了
再也不怕冒泡排序了,看完这篇Go语言详解就会了
4496 0