分治算法,二叉树例题《数据结构入门到精通N13-N15》

简介: 分治算法,二叉树例题《数据结构入门到精通N13-N15》

分治算法

思想

思想就是大问题分成相同问题的子问题。

分治就是递归。

分治法在每一层递归上都有三个步骤:


   step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;


   step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题


   step3 合并:将各个子问题的解合并为原问题的解。


下面我们用三个简单的例子来深入理解分治算法。每题代码里面都有注释哈。(配原题链接)



例一:相同的树

原文链接


image.png


image.png


image.png


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
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);
}



例二:单值二叉树

原文链接


image.png


image.png


image.png


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
//int flag=0;
//int temp=0;
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){
/*
解题思路:
遍历二叉树,并且每一个节点值都和根节点的值进行比对,如果不等于根节点的值,则不是单值树。
*/
    if(root==NULL)
    return true;
    int val=root->val;
    return _isUnivalTree(root,val);
/
    // if(root==NULL)
    // return true;
    // if(temp==0)
    // {
    // flag=root->val;
    // temp=1;
    // }
    // else
    // {
    //     if(root->val!=flag)
    //     return false;
    // }
    // flag=0;
    // isUnivalTree(root->left);
    // flag=0;
    // isUnivalTree(root->right);
    // return true;
}



例三:二叉树的最大深度

原文链接


image.png


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int maxDepth(struct TreeNode* root){
    //左最大深度+1  右最大深度+1
    //root==NULL return 0
    if(root==NULL)
    return 0;
    int leftDepth=maxDepth(root->left);
    int rightDepth=maxDepth(root->right);
    return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
}
相关文章
|
4月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
120 1
|
9月前
|
算法 搜索推荐 Java
算法系列之分治算法
分治算法(Divide and Conquer)是一种解决复杂问题的非常实用的策略,广泛应用于计算机科学中的各个领域。它的核心思想是将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将子问题的解合并,最终得到原问题的解。分治算法的典型应用包括归并排序、快速排序、二分查找等。
294 72
 算法系列之分治算法
|
4月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
126 0
|
8月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
241 10
 算法系列之数据结构-二叉树
|
8月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
198 3
 算法系列之数据结构-Huffman树
|
8月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
287 22
|
9月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
285 30
|
9月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
408 25
|
9月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
422 23
|
10月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
248 12

热门文章

最新文章