分治算法,二叉树例题《数据结构入门到精通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;
}
相关文章
|
7天前
【数据结构】二叉树(遍历,递归)
【数据结构】二叉树(遍历,递归
15 2
|
3天前
|
机器学习/深度学习 存储 算法
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
11 1
|
3天前
|
并行计算 算法 索引
数据结构与算法 分治
数据结构与算法 分治
6 0
|
4天前
【数据结构】二叉树的三种遍历(非递归讲解)
【数据结构】二叉树的三种遍历(非递归讲解)
6 1
|
4天前
|
存储
【数据结构】二叉树相关oj题(一)
【数据结构】二叉树相关oj题(一)
8 1
|
5天前
|
存储 数据库 C++
高效处理大规模数据集的概率型数据结构—— 布隆过滤器 [C++入门]
高效处理大规模数据集的概率型数据结构—— 布隆过滤器 [C++入门]
13 0
|
7天前
|
存储 分布式数据库
[数据结构]~二叉树
[数据结构]~二叉树
|
7天前
|
搜索推荐 C语言
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
11 0
|
7天前
|
C语言
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
279 52
|
7天前
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)
16 4