算法——二叉树类

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法——二叉树类相关的知识,希望对你有一定的参考价值。

一、解题思路

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

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

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

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

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

1)递归出口:叶子结点

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

二、例题

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

1. 翻转二叉树

 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
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.相同的树

 

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
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。

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
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);
    
;

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于算法——二叉树类的主要内容,如果未能解决你的问题,请参考以下文章

二叉树类高频算法题golang实现

用java实现二叉树的遍历算法

Leetcode练习(Python):树类:第98题:验证二叉搜索树:给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节

Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。

Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。

二叉树类问题框架