【数据结构与算法】二叉树题解

🎬 博主名称键盘敲碎了雾霭
🔥 个人专栏 : 《C语言》《数据结构》

⛺️指尖敲代码,雾霭皆可破


文章目录

  • 一、单值二叉树
    • [1.1 题目描述](#1.1 题目描述)
    • [1.2 解题思想](#1.2 解题思想)
    • [1.3 代码实现](#1.3 代码实现)
  • 二、相同的树
    • [2.1 题目描述](#2.1 题目描述)
    • [2.2 解题思想](#2.2 解题思想)
    • [2.3 代码实现](#2.3 代码实现)
  • 三、对称二叉树
    • [3.1 题目描述](#3.1 题目描述)
    • [3.2 解题思想](#3.2 解题思想)
    • [3.3 代码实现](#3.3 代码实现)
  • 四、二叉树的前序遍历
    • [4.1 题目描述](#4.1 题目描述)
    • [4.2 解题思想](#4.2 解题思想)
    • [4.3 代码实现](#4.3 代码实现)
  • 五、另一棵树的子树
    • [5.1 题目描述](#5.1 题目描述)
    • [5.2 解题思想](#5.2 解题思想)
    • [5.3 代码实现](#5.3 代码实现)
  • 六、二叉树遍历
    • [6.1 题目描述](#6.1 题目描述)
    • [6.2 解题思想](#6.2 解题思想)
    • [6.3 代码实现](#6.3 代码实现)
  • 七、是否为平衡二叉树
    • [7.1 题目描述](#7.1 题目描述)
    • [7.2 解题思想](#7.2 解题思想)
    • [7.3 代码实现](#7.3 代码实现)

一、单值二叉树

1.1 题目描述

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false。
原题链接:965.单值二叉树

1.2 解题思想

每棵树都与左子树与右子树进行比较,遇到空返回真,依次往下递归

1.3 代码实现

c 复制代码
bool isUnivalTree(struct TreeNode* root) 
{
    if(root==NULL)
    {
        return true;
    }
    if(root->left&&root->val!=root->left->val)
    {
        return false;
    }
    if(root->right&&root->val!=root->right->val)
    {
        return false;
    }
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

二、相同的树

2.1 题目描述

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
原题链接:100.相同的树

2.2 解题思想

拆为左子树与左子树相同,右子树与右子树相同

2.3 代码实现

c 复制代码
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);
}

三、对称二叉树

3.1 题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。
原题链接:101.对称二叉树

3.2 解题思想

在相同树的基础上变为左子树与右子树比较

3.3 代码实现

c 复制代码
bool isSame(struct TreeNode* root1,struct TreeNode* root2)
{
    if(root1==NULL&&root2==NULL)
    {
        return true;
    }
    if(root1==NULL||root2==NULL)
    {
        return false;
    }
    if(root1->val!=root2->val)
    {
        return false;
    }
    return isSame(root1->left,root2->right)&&isSame(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root) 
{
    return isSame(root->left,root->right);
}

四、二叉树的前序遍历

4.1 题目描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历
原题链接:144.二叉树的前序遍历

4.2 解题思想

传下标时要传地址进去

4.3 代码实现

c 复制代码
 int CountSize(struct TreeNode* root)
 {
    if(root==NULL)
    {
        return 0;
    }
    return CountSize(root->left)+CountSize(root->right)+1;
}
void PreOrder(int *arr,int *pi,struct TreeNode* root)
{
    if(root==NULL)
    {
        return;
    }
    arr[(*pi)++]=root->val;
    PreOrder(arr,pi,root->left);
    PreOrder(arr,pi,root->right);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    *returnSize=CountSize(root);
    int *arr =malloc(sizeof(int)*(*returnSize));
    int i=0;
    PreOrder(arr,&i,root);
    return arr;
}

五、另一棵树的子树

5.1 题目描述

给你两棵二叉树 root 和具有相同结构和节点值的子树。如果存在,返回true ;否则,返回false 二叉树 tree 的一棵子树包括 tree的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
原题链接:572.另一棵树的子树

5.2 解题思想

依次遍历,子树是否相等

5.3 代码实现

c 复制代码
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(root->val==subRoot->val&&isSameTree(root,subRoot))
    {
        return true;
    }
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

六、二叉树遍历

6.1 题目描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中"#"表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
原题链接:TSINGK110 二叉树遍历

6.2 解题思想

递归思想、前序创建,中序遍历

6.3 代码实现

c 复制代码
#include <stdio.h>
#include<stdlib.h>
typedef struct BTNode
{
    char val;
    struct BTNode*left;
    struct BTNode*right;
}BTNode;

BTNode* GreatTree(char*arr,int *pi)
{
    BTNode*root=(BTNode*)malloc(sizeof(BTNode));
    if(arr[(*pi)]=='#')
    {
        root=NULL;
        (*pi)++;
        return NULL;
    }
    root->val= arr[(*pi)++];
    root->left=GreatTree(arr,pi);
    root->right=GreatTree(arr,pi);
    return root;
}

void InOrder(char *arr,int *pi,struct BTNode* root)
{
    if(root==NULL)
    {
        return;
    }
    InOrder(arr,pi,root->left);
    printf("%c ",root->val);
    InOrder(arr,pi,root->right);
}
int main()
{
    char arr[100]={0};
    scanf("%s",arr);
    int i=0;
    BTNode*root = GreatTree(arr,&i);
    i=0;
    InOrder(arr,&i,root);
}

七、是否为平衡二叉树

7.1 题目描述

给定一个二叉树,判断它是否是 平衡二叉树
原题链接:110.平衡二叉树

7.2 解题思想

  • 判断以根结点的树是否为二叉平衡树。求出左右子树的高度,判断它们的高度差是否超过了1。
  • 递归判断根的左子树是否为平衡二叉树
  • 递归判断根的右子树是否为平衡二叉树
    注意:空树也是平衡二叉树

7.3 代码实现

c 复制代码
int TreeHigh(struct TreeNode* root)
{
    if(root==NULL)
    {
        return 0;
    }
    int left =TreeHigh(root->left);
    int right=TreeHigh(root->right);
    return left>right?left+1:right+1;
}
bool isBalanced(struct TreeNode* root) 
{
    if(root==NULL)
    {
        return true;
    }
    int left=TreeHigh(root->left);
    int right=TreeHigh(root->right);
    if(abs(left-right)>1)
    {
        return false;
    }
    return isBalanced(root->left)&&isBalanced(root->right);
}
相关推荐
像污秽一样2 小时前
算法设计与分析-算法效率分析基础-蛮力法
数据结构·算法·排序算法
菜菜小狗的学习笔记2 小时前
数据结构(一)数组和链表
数据结构
仰泳的熊猫2 小时前
题目1834:蓝桥杯2016年第七届真题-路径之谜
数据结构·c++·算法·蓝桥杯·深度优先·图论
Darkwanderor2 小时前
数据结构——单调栈和单调队列
数据结构·c++·单调栈·单调队列
自信150413057592 小时前
数据结构之队列的实现
c语言·数据结构·算法·链表
宵时待雨2 小时前
C++笔记归纳8:stack & queue
开发语言·数据结构·c++·笔记·算法
24白菜头2 小时前
第十六届蓝桥杯C&C++大学B组
数据结构·c++·笔记·算法·职场和发展·蓝桥杯
小年糕是糕手2 小时前
【35天从0开始备战蓝桥杯 -- Day1】
jvm·数据结构·c++·程序人生·算法·职场和发展·蓝桥杯
xlp666hub6 小时前
C++ 链表修炼指南
数据结构·c++