分治算法,二叉树例题《数据结构入门到精通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;
}
相关文章
|
3天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
1天前
|
算法
数据结构中的KMP算法及其改进算法
KMP算法通过引入部分匹配表,有效避免了重复计算,从而将字符串匹配的时间复杂度降低到O(m+n)。通过进一步优化next数组,KMP算法的效率得到了进一步提升。对于大规模字符串匹配问题,KMP算法及其改进算法提供了高效的解决方案,是计算机科学领域的经典算法之一。
10 3
|
2天前
|
存储
数据结构初阶 初识二叉树
数据结构初阶 初识二叉树
7 0
|
2天前
|
机器学习/深度学习 算法
数据结构入门 时间 空间复杂度解析
数据结构入门 时间 空间复杂度解析
4 0
|
3天前
|
存储 缓存 算法
LeetCode力扣题目111:多种算法对比实现二叉树的最小深度
LeetCode力扣题目111:多种算法对比实现二叉树的最小深度
|
3天前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
|
3天前
|
存储 SQL 算法
LeetCode 题目 94:五种算法递归|迭代|莫里斯|线索二叉树|栈的迭代二叉树 实现中序遍历
LeetCode 题目 94:五种算法递归|迭代|莫里斯|线索二叉树|栈的迭代二叉树 实现中序遍历
|
4天前
|
存储 算法 数据挖掘
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
|
7天前
|
存储 算法
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
10 0
|
7天前
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
9 1