算法给小码农二叉树OJ淬体

简介: 算法给小码农二叉树OJ淬体

文章目录



二叉树OJ淬体

例1:单值二叉树

题目

bool isUnivalTree(struct TreeNode* root){
    //空树直接就是单值
    if(!root)
        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);
}

例2:二叉树的前序遍历

题目

//我们先把二叉树的节点个数求出来
int BinaryTreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
}
void _preorderTraversal(struct TreeNode* root,int* a,int* i)
{
    if(!root)
        return;
    a[(*i)++] = root->val;
    _preorderTraversal(root->left,a,i);
    _preorderTraversal(root->right,a,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    //我们知道二叉树节点个数就好开辟数组大小了
    int size =  BinaryTreeSize(root);
    int* a = (int*)malloc(sizeof(int)*size);
    //我们直接递归preorderTraversal它,是不好递归的因为每次递归你都开辟一个数组吗,不现实
    //我们应该递归他的类似性质的函数,不过不可以次次开辟数组,应该传递数组再给一个下标
    int i = 0;
    _preorderTraversal(root,a,&i);
    *returnSize = size;
    return a;
}

例3:二叉树的中序遍历

题目

 //二叉树节点个数函数
int BinaryTreeSize(struct TreeNode* root){
    if(!root)
        return 0;
    return BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
}
//子函数
void _inorderTraversal(struct TreeNode* root,int* a,int* pi){
    if(!root)
        return;
    _inorderTraversal(root->left,a,pi);
    a[(*pi)++] = root->val;
    _inorderTraversal(root->right,a,pi);   
}
int* inorderTraversal(struct TreeNode* root, int* returnSize){
    //把节点个数赋给数组大小
    int size = BinaryTreeSize(root);
    //创建合适的数组
    int* a = (int*)malloc(sizeof(int)*size);
    int i = 0;
    _inorderTraversal(root,a,&i);
    *returnSize = size;
    return a;
}

例4:二叉树的后序遍历

题目

//二叉树
int BinaryTreeSize(struct TreeNode* root){
    return root == NULL ? 0 : BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
}
//子函数
void _postorderTraversal(struct TreeNode* root,int* a,int* pi){
    if(!root)
        return;
    _postorderTraversal(root->left,a,pi);
    _postorderTraversal(root->right,a,pi);
    a[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
    //数组大小传过来
    int size = BinaryTreeSize(root);
    //创建合适的数组
    int* a = (int*)malloc(sizeof(int)*size);
    int i = 0;
    _postorderTraversal(root,a,&i);
    *returnSize = size;
    return a;
}

例5:相同的树

题目

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    //都为空
    if(!p && !q)
        return true;
    //有且只有一个是空
    if(!p || !q)
        return false;
    //没有空树
    if(p->val != q->val)
        return false;
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

例6:对称二叉树

题目

bool _isSymmetricTree(struct TreeNode* root1,struct TreeNode* root2)
{
    //两个都是空就返回真
    if(!root1 && !root2)
        return true;
    //只有一个空直接假
    if(!root1 || !root2)
        return false;
    if(root1->val != root2->val)
        return false;
    return _isSymmetricTree(root1->left,root2->right) 
        && _isSymmetricTree(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root){
    //空树就是对称
    if(!root)
        return true;
    //返回他们判断结果    
    return _isSymmetricTree(root->left,root->right);
}

例7:另一棵树的子树

题目

 //判断是否是相同的树
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    //都为空
    if(!p && !q)
        return true;
    //有且只有一个是空
    if(!p || !q)
        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)
        return false;
    if(isSameTree(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot)
        || isSubtree(root->right,subRoot); 
}

例8:二叉树遍历

题目

#include <stdio.h>
#include <stdlib.h>
//树节点
typedef struct BinaryTreeNode
{
    struct BinaryTreeNode* right;
    struct BinaryTreeNode* left;
    int val;
}BTNode;
//创建树
BTNode* CreateTree(char* str,int* pi)
{
    //#就返回空
    if(str[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    //不是空开始建树
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    root->val = str[(*pi)++];
    //递归创建
    root->right = CreateTree(str,pi);
    root->left = CreateTree(str,pi);
    return root;
}
//中序遍历
void InOrder(BTNode* root)
{
    //空就返回
    if(!root)
        return;
    //先走左
    InOrder(root->right);
    //打印中
    printf("%c ",root->val);
    //再走右
    InOrder(root->left);
}
int main()
{
    //因为不超过100
    char str[100] = {0};
    //多组输入
    while(scanf("%s",str) != EOF)
    {
        //创建树
        int i = 0;
        BTNode* root = CreateTree(str,&i);
        InOrder(root);
    }    
    return 0;
}


目录
相关文章
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
58 5
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
41 0
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
31 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
35 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
2月前
|
存储 算法
【二叉树】—— 算法题
【二叉树】—— 算法题
【二叉树】—— 算法题
|
2月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
31 0
|
4月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
33 0
|
4月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
83 0
|
4月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
44 0
下一篇
DataWorks