[数据结构]:6.二叉树链式结构的实现2

二叉树链式结构的实现2

前言

嗨,我是firdawn,本章将使用二叉树的OJ题来帮大家巩固二叉树的遍历,查找操作,以及教大家学会任何通过递归方式实现二叉树的查找值,判断两棵树是否相同,一颗树是否是另一棵树的子树以及二叉树的创建操作。下面是本章的思维导图,那么让我们开始吧!

一,单值二叉树

题目:单值二叉树

答案:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool _isUnivalTree(struct TreeNode* root,int val)
{
    if(root==NULL)
    {
        return true;
    }
    if(root->val!=val)
    {
        return false;
    }
    return _isUnivalTree(root->left,val) && _isUnivalTree(root->right,val);
}

bool isUnivalTree(struct TreeNode* root) {

    //遍历判断
    //return  _isUnivalTree(root,root->val);

    //用分治思想解决
    //为空  返回ture
    //不为空    根和左子树相等,根和右子树相等并且左右子树都为单值二叉树时,该树为单值二叉树
    //
    if(root==NULL)
    {
        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);
}

二,检查两颗树是否相同

题目:检查两颗树是否相同

答案:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //返回条件:一一比较两颗树的结点,1.如果p为空且q为空return ture     2.如果p为空q不为空,或者p为空q不为空,return false
    //子问题:先比较当前结点,当前结点不相等,就返回false
    //        如果当前结点相等,然后再来比较左子树是否相等和右子树是否相等,如果都相等return ture
    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);
}

三,对称二叉树

题目:对称二叉树

答案:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool _isSymmetric(struct TreeNode* left, struct TreeNode* right)
{
    //返回条件:1.left为空,right为空,return true  2.left为空right不为空或者left不为空right为空return false
    //子问题:1.left和right不相等return false   如果相等再比较left的左边和right的右边是否相等,以及left的右边和right的左边是否相等,都相等才返回true
    if(left == NULL && right == NULL)
    {
        return true;
    }
    if(left == NULL || right == NULL)
    {
        return false;
    }
    if(left->val != right->val)
    {
        return false;
    }
    return _isSymmetric(left->left,right->right) && _isSymmetric(left->right, right->left);

}


bool isSymmetric(struct TreeNode* root) {
    if(root==NULL)
    {
        return true;
    }
    return _isSymmetric(root->left,root->right);
}

四,二叉树的前序遍历

题目:二叉树的前序遍历

答案:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int BinaryTreeSize(struct TreeNode* root)
 {
    return root==NULL ? 0 : BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
 }

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

}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=BinaryTreeSize(root);
    int* arr=(int*)malloc(sizeof(int)*(*returnSize));
    if(arr==NULL)
    {
        perror("malloc fail");
        return NULL;
    }

    int i=0;
    _preorderTraversal(root,arr,&i);
    return arr;
}

五,另一棵树的子树

题目:另一颗树的子树

答案:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 bool isSameTree(struct TreeNode* root, struct TreeNode* subRoot)
 {
    if(root==NULL && subRoot == NULL)
    {
        return true;
    }
    if(root == NULL || subRoot == NULL)
    {
        return false;
    }
    if(root->val!=subRoot->val)
    {
        return false;
    }
    return isSameTree(root->left,subRoot->left) && isSameTree(root->right,subRoot->right);
 }
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    //解题思路:遍历root的所有子树,因为root的所有结点都可以看作子树的根结点,所以我们只需要遍历root的所有结点,再与subRoot比较,如果两颗树相等就返回true,不相等就再遍历root的左子树进行比较和右子树进行比较,只要子树中找到了就返回ture
    //返回条件:1.root为空return false  
    //子问题:root不为空,比较两颗树是否相等,相等就返回true,
    //      不相等就比较root的左子树是否和subRoot相等,比较root的右子树是否和subRoot相等,只要相等就返回true

    if(root == NULL)
    {
        return false;
    }
    if(root->val == subRoot->val && isSameTree(root,subRoot))
    {
        return true;
    }
    return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

六,二叉树的创建

题目:二叉树的创建

答案:

c 复制代码
#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>

typedef char BTDataType;
typedef struct BinaryTreeNode
{
    BTDataType val;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
}BTNode;

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

void InOrder(BTNode* root)
{
    if(root == NULL)
    {
        return ;
    }
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}



int main() {
    BTDataType arr[100]={0};
    scanf("%s",arr);
    int i=0;
    BTNode* root = BinaryCreat(arr, &i);
    InOrder(root);
    return 0;
}
相关推荐
apocelipes13 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假7 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠8 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦15 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
小小工匠16 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
Luminous.16 天前
C语言--day30
c语言·开发语言
玖玥拾16 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽16 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言