【Leetcode】二叉树专题(仅需【7道题】就可以带你入门二叉树基本玩法)

一 剑指 Offer 27. 二叉树的镜像

在这里插入图片描述

剑指 Offer 27. 二叉树的镜像- - 思路- -(递归)

思路:
递归二叉树的左子树,再递归二叉树的右子树,这样就可以把二叉树的左右子树都给弄成镜像二叉树;
再交换根的左右子树,那么整个树的镜像二叉树就出来了;
注意细节:当树为空就直接返回空树即可!


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	TreeNode* mirrorTree(TreeNode* root) {
	//递归结束条件,树为空,镜像也是空
	if(root == NULL) return NULL;
	
	//来到这里书名树不为空
	//递归左子树,再递归右子树
	mirrorTree(root->left);
	mirrorTree(root->right);
	
	//交换根的左结点和右节点
	swap(root->left,root->right);
	return root;

 	}
};

二 剑指 Offer 28. 对称的二叉树

在这里插入图片描述


剑指 Offer 28. 对称的二叉树- - 思路 - - (递归)

思路:
只要判断左子树和右子树是否为对称即可;
那么如何判断左子树和右子树是否对称呢?
构造一个新的函数,判断两颗树是否对称即可;


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	//判断两棵树是否为对称
    bool _isSymmetric(TreeNode* root1,TreeNode* root2)
    {
    	//如果两棵树都是空,那么为真,对称
        if(root1 == NULL && root2 == NULL ) return true;
		//如果任意一颗为空,另一个不为空,那么就不对称
        if(root1 == NULL || root2 == NULL) return false;
		//两棵树的根结点相等的同时,也保证一个树的左子树和另一个树的右子树相等,
		//相反也是,那么就可以说是对称的两棵树
        return root1->val == root2->val 
                && _isSymmetric(root1->left,root2->right)
                && _isSymmetric(root1->right,root2->left);
     }
     //判断一棵树是否为对称的二叉树
    bool isSymmetric(TreeNode* root) {
        if(root == NULL) return true;
        return _isSymmetric(root->left,root->right);                
    }
};

三 剑指 Offer 55 - I. 二叉树的深度

在这里插入图片描述


剑指 Offer 55 - I. 二叉树的深度- - 思路- - (递归)

  1. 先求出左子树的深度,再求出右子树的深度;
  2. 最后判断左子树和右子树的深度谁比较大,然后拿两者之间的最大值+1就是二叉树的深度;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == NULL) 
            return 0;
        if(root->left == NULL && root->right == NULL)
            return 1;
        
        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);
        
        return max(leftDepth,rightDepth) +1;

    }
};

四 剑指 Offer 55 - II. 平衡二叉树

在这里插入图片描述


剑指 Offer 55 - II. 平衡二叉树- - 思路- -(递归)

思路:
只要判断左子树是否为平衡树,右子树是否为平衡树,同时判断左右子树的高度差绝对值不超过一即可!
如何判断左右子树高度差不超过一?
只要写一个新函数,求出二叉树的深度,再求左右子树的高度差绝对值即可;


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	//求二叉树的深度
     int maxDepth(TreeNode* root) {
        if(root == NULL) 
            return 0;
        if(root->left == NULL && root->right == NULL)
            return 1;
        
        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);
        
        return max(leftDepth,rightDepth) +1;

    }
    //判断是否为平衡树
    bool isBalanced(TreeNode* root) {
        if(root == NULL) return true ;
		
        return abs(maxDepth(root->left)-maxDepth(root->right)) <=1
                && isBalanced(root->left)
                && isBalanced(root->right);
    }
};

五 100. 相同的树

在这里插入图片描述


100. 相同的树 - - 思路- -(递归)

只要判断q树的左子树和p树的左子树相等和q树的右子树和p树的右子树都相等即可!
如何判断呢?递归判断;

/**
 * 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) {
        //空树一定是相等的树
        if(p == NULL && q == NULL) return true;
        //任意一个为空,另一个不为空都不是相等的树
        if(p == NULL || q == NULL) return false;

        //递归左子树和右子树,判断其对应结点是否为相等即可
        return p->val == q->val
              && isSameTree(p->left,q->left)
              && isSameTree(p->right,q->right);
    }
};

六 572. 另一棵树的子树

在这里插入图片描述


572. 另一棵树的子树- - 思路- -(递归)

子树和二叉树相等,那么子树一定是二叉树的子树;
如果不相等,再递归判断子树是否为二叉树的左子树,或者递归判断子树是否为二叉树的右子树,只要满足一个,那么就说明子树一定是二叉树的子树了;


/**
 * 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* root1, TreeNode* root2)
{
    if(root1 == NULL && root2 == NULL ) return  true;

    //只要有一个为空另一个不为空那么就不是相同的树
    if(root1 == NULL || root2 == NULL) return false;

    return root1->val == root2->val &&
        isSametree(root1->left,root2->left) && 
        isSametree(root1->right,root2->right);
}
	//判断是否为二叉树的子树
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
         //如果root为空树,subRoot肯定不是它的子树
        if(root == NULL) return false;
        //如何子树和树相同,那么一定是子树
        if(isSametree(root,subRoot)) return true;
        //否子递归树的左子树判断和子树相等或者递归树的右子树和子树相等即可
        return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);

    }
};

七 965. 单值二叉树

在这里插入图片描述

965. 单值二叉树- - 思路 - -(递归)

思路:
递归左子树和右子树判断是否为单值二叉树,同时要保证左子树的根和右子树的根是和二叉树相等的;
如何保证左子树的根和右子树的根是和二叉树相等?
我们只需要判断它的对立面,把对立面考虑出来就行:
假如二叉树树的左子树不为空,那么左子树的根和二叉树的根不相等,这就肯定不是单值二叉树;
假如二叉树树的右子树不为空,那么右子树的根和二叉树的根不相等,这就肯定不是单值二叉树;


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
//判断根是否和左子树或者右子树相等,是就是单值二叉树

bool isUnivalTree(struct TreeNode* root){
    if(root == NULL) return true;

    //如果左子树的结点和根结点不相等就不是单值二叉树
    //前提需要判断左子树存在,即不为空就表示存在
    if(root->left && root->left->val !=root->val)
    {
        return false;
    }
     //如果右子树的结点和根结点不相等就不是单值二叉树
    //前提需要判断右子树存在,即不为空就表示存在
    if(root->right && root->right->val !=root->val)
    {
        return false;
    }
    
    //假如直接返回 true就会出错,因为你上面的代码只是保证了根和根的左右孩子相等
    //但是没有保证,左右孩子的下面的子左右孩子是否相等呀
    //return true; //错误返回方式

    //正确的方式
    //还需要继续判断左右子树下面的子左右子树的值是否为单值

    return isUnivalTree(root->left) && isUnivalTree(root->right);

}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>