栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

算法——二叉树类

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法——二叉树类

一、解题思路

二叉树类的算法有两条解题思路。选一个就能解题

1. 思路(一):这也是我最常用的思路。只针对根节点和其左右子树(把左右子树各看成一个节点就行)解决当前问题,就像下面这样。这样就避免了对递归的考虑

1)边界:考虑是一颗空树时的情况(root==null)

2)再考虑对根节点的处理,对左子树的处理,对右子树的处理

2. 思路(二):递归思想。

1)递归出口:叶子结点

2)再考虑对根节点的处理,对左子树的处理,对右子树的处理

二、例题

这些例题我都是用第一个思路去做的,也在注释上标明了思路。

1. 翻转二叉树  

 

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //1.空树
        if(root==NULL)  return NULL;  

        //2.根节点不用考虑

        //3.考虑左子树和右子树的处理
        TreeNode* left=invertTree(root->right);  //left是翻转后应该在left的
        TreeNode* right=invertTree(root->left);  //right是翻转后应该在right的
        root->right=right;
        root->left=left;
        return root;       //!!!最后返回整棵树的根节点
    }
};
2.相同的树

 

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        //1.空树
        if(p==nullptr&&q==nullptr) return true;  //空树1
        else if(p==nullptr&&q!=nullptr) return false; //空树2
        else if(p!=nullptr&&q==nullptr) return false; //空树3
        
        //2.这里把根节点、左子树、右子树的处理一起考虑了
        else{
            return (p->val==q->val&&isSameTree(p->left,q->left)&&isSameTree(p->right,q->right));
        }
    }
};
3. 路径总和

 

这个题注意看一下最后一个示例3。

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        //1.空树
        if(root==nullptr) return false; 

        //2.考虑根节点的处理
        if(root->left==nullptr&&root->right==nullptr&&targetSum==root->val) return true;

        //3.考虑对左子树、右子树的处理
        int left = targetSum - root->val;
        return hasPathSum(root->left,left)||hasPathSum(root->right,left);
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913721.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号