IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树的OJ题 -> 正文阅读

[数据结构与算法]二叉树的OJ题

目录

1.?965. 单值二叉树

2.?100. 相同的树

3.?101. 对称二叉树

4.?144. 二叉树的前序遍历

5.????????572. 另一棵树的子树

6.二叉树遍历_牛客题霸_牛客网 (nowcoder.com)


(温馨提示:这里的标题本身就是题的链接)

1.?965. 单值二叉树

题目:

bool isUnivalTree(struct TreeNode* root){
    if(root==NULL)//为空结点说明这一个支线已经相同,就返回true
    return true;
    if(root->left&&root->left->val!=root->val)//先判断左孩子和根值是否相同
    return false;
    if(root->right&&root->right->val!=root->val)//左孩子和根已经相同,判断右孩子和根是否相同
    return false;
    return isUnivalTree(root->left)&&isUnivalTree(root->right);//继续向下判断
}

单值二叉树就是所有节点值相同的二叉树,若要判断所有结点值相同,首先要思路就是判断根结点和左右孩子的值是否相同,如果相同,不能返回true,因为下面的结点还没判断,还要继续判断左孩子是否和他的左右结点值相同,右孩子是否和他自己的左右结点值相同,放 是否相同 就没办法放返回值了,所以这里的if语句不能放是否值相同,应该放 值是否不相同,不相同就返回false。

过程是:先判断根节点是不是空结点,是空结点也算单值,返回true;如果不是空结点,先判断根节点和左孩子值是否相同,不相同返回false,相同继续判断根和右孩子值是否相同:不相同返回false,相同的话继续重复判断左孩子是否和他的左右结点值相同,右孩子是否和他自己的左右结点值相同。一直到传入叶子结点,说明上面的结点都相同了,叶子结点不为空,但是他的左右孩子都是空,就不能访问左右孩子的值,所以要加上判断左右孩子是否为空的条件,为空就是叶子,左右是空就不用比较了,返回true。

2.?100. 相同的树

(温馨提示:这里的标题本身就是链接)

题目:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL&&q==NULL)    //①节点全为空则相同返回true
    return true;
    if(p==NULL||q==NULL)    //②节点一空一非空一定不同返回false
    return false;
    if(p->val!=q->val)    //③两节点都是非空,判断不相同返回false
    return false;
    return isSameTree(p->left, q->left)&&isSameTree(p->right, q->right);  //继续向下比较左右节点
}

比两颗二叉树是否相同有三种情况:①节点全为空则相同返回true?②节点一空一非空一定不同返回false ③两个节点都是非空,不相同返回false,如果if条件设成相同,成立了也不能返回,还得继续向下比,所以不能设为相同而需要设成不相同返回false才能继续比较,如果相同不返回false,继续比较下面的左右节点即可。

3.?101. 对称二叉树

(温馨提示:这里的标题本身就是链接)

题目:

bool _isSymmetric(struct TreeNode* p,struct TreeNode* q)
{
    if(p==NULL&&q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    if(p->val!=q->val)
    return false;
    return _isSymmetric(p->left, q->right)&&_isSymmetric(p->right, q->left);
}

bool isSymmetric(struct TreeNode* root){
    if(root==NULL)//只有一个空节点时是对称返回true。 当比较到叶子下面的空节点时说明对称,返回true
    return true;
    return _isSymmetric(root->left,root->right);   //利用对称函数判断是否对称,根节点不用比较,所以从左右节点开始
}

①只有一个空节点时是对称返回true。 当比较到叶子下面的空节点时说明对称,返回true

②利用对称函数判断是否对称,根节点不用比较,所以从左右节点开始

③_isSymmetric 判断对称函数相当于是把判断二叉树相同函数进行修改;把根节点的左右子树看成两个树传入此函数,判断两个树是否相同时我们拿树1和树2的相同位置节点相比较:

【 return _isSymmetric(p->left, q->left)&&_isSymmetric(p->right, q->right); 】
这里是拿对称的位置进行比较,只要把传入的两个节点改成一左一右就成为比较两树是否对称的函数了:

【 return _isSymmetric(p->left, q->right)&&_isSymmetric(p->right, q->left); 】

4.?144. 二叉树的前序遍历

(温馨提示:这里的标题本身就是链接)

题目:

int BTreeSize(struct TreeNode* root)
{
    return root==NULL?0:BTreeSize(root->left)+BTreeSize(root->right)+1;
}

void _preorder(struct TreeNode* root,int* a,int* pi)
{
    if(root==NULL)
    return ;
    a[(*pi)++]=root->val;
    _preorder(root->left,a,pi);
    _preorder(root->right,a,pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int size=BTreeSize(root);
    int* a=(int*)malloc(sizeof(int)*size);
    * returnSize=size;
    int i=0;
    _preorder(root,a,&i);
    return a;
}

思路:需要返回一个数组a,只需要利用二叉树前序遍历函数preorder ,把打印这个值改成每次把这个值给数组a最后返回a就可以了(注意:为了让a能每次下标走下去,需要传i的地址进去才可以)并且用malloc给a开辟空间时,还需要知道a数组的大小,所以再利用一个计算二叉树节点个数的函数 BTreeSize (此函数详细讲解请见(155条消息) “二叉树遍历“详解 以及 二叉树的实现_beyond.myself的博客-CSDN博客?中二.1.⑤)

5.????????572. 另一棵树的子树

(温馨提示:这里的标题本身就是链接)

题目:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL&&q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    if(p->val!=q->val)
    return false;
    return isSameTree(p->left, q->left)&&isSameTree(p->right, q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL)
    return false;
    if(isSameTree(root,subRoot))
    return true;
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

?当走到root节点为空时,肯定不包含subRoot,返回false;如果不为空就利用 判断两棵树是否相同函数 从已到的节点开始判断下面部分是否相同,相同就是包含subRoot,就返回true,不包含不能直接返回false,还得继续向下比较,所以说这里只要?isSameTree(root,subRoot) 成立一次就可以返回true,不成立继续向下找,只要包含成立一次就是返回true(所以用逻辑运算符 或|| ),不包含继续向下找,直到找到空节点就返回false。还可以写成下面的形式:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL&&q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    if(p->val!=q->val)
    return false;
    return isSameTree(p->left, q->left)&&isSameTree(p->right, q->right);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL)
    return false;
    return isSameTree(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

6.二叉树遍历_牛客题霸_牛客网 (nowcoder.com)

(温馨提示:这里的标题本身就是链接)

题目:

?先把输入数据放入数组a,利用 CreatTree 函数,每创建一个节点,就把数组a中的数据放入,按前序遍历依次放入二叉树,边创建节点边放值,如果数组a中数据是‘#’就是空节点,返回NULL,会把NULL赋给这个节点同时也就结束递归,最后返回根节点tree到主函数中,再进行中序遍历打印即可

#include<stdio.h>
#include<stdlib.h>

typedef char BTDataType;
typedef struct BinaryTreeNode        //创建二叉树结构体
{
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
    BTDataType data;
}BTNode;

BTNode* CreatTree( char* a,int* pi)    
 {
     if(a[*pi]=='#')            //数据是‘#’就是空节点,返回NULL,同时也就结束递归
     {
         (*pi)++;
         return NULL;
     }
     BTNode* tree=( BTNode*)malloc(sizeof( BTNode));    //边创建节点边放值
     tree->data=a[(*pi)++];                             //边创建节点边放值
     tree->left=CreatTree( a, pi);            //前序遍历的形式
     tree->right=CreatTree( a, pi);
     return tree;
 }

void Inorder( BTNode* root)    //中序遍历打印
{
    if(root==NULL)
        return ;
    Inorder( root->left);
    printf("%c ",root->data);
    Inorder( root->right);
}

int main()
{
    char a[100];
    scanf("%s",a);
    int i=0;
    BTNode* tree=CreatTree(a,&i);    //传&i 是使数组a下标可以正常走
    Inorder(tree);
    return 0;
}

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:07:49  更:2022-04-18 18:07:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:24:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码