0


【LeetCode-二叉树训练】

在这里插入图片描述每一个不曾起舞的日子,都是对生命的辜负。

二叉树训练

1. 单值二叉树🚀

  1. 单值二叉树

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回

true

;否则返回

false

示例 1:

img

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

img

输入:[2,2,2,5,2]
输出:false

提示:

  1. 给定树的节点数范围是 [1, 100]
  2. 每个节点的值都是整数,范围为 [0, 99]

思路:通过root与其两个子节点判断是否相等,为了通过这个步骤遍历树的所有节点,采用递归方式去遍历即可

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

bool isUnivalTree(struct TreeNode* root){if(root ==NULL)returntrue;if(root->left && root->val != root->left->val)returnfalse;if(root->right && root->val != root->right->val)returnfalse;returnisUnivalTree(root->left)&&isUnivalTree(root->right);}

在这里插入图片描述

2. 相同的树🚀

  1. 相同的树

给你两棵二叉树的根节点

p

q

,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

img

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

img

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

img

输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100]
  • -104 <= Node.val <= 104

思路:相同的树必须满足按照相同步骤能够同时访问到空节点,并且每次访问的值都相同,因此仍然是遍历树的所有节点,此时只需要递归即可。

/**
 * 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){returntrue;}if(p ==NULL|| q ==NULL|| p->val != q->val){returnfalse;}returnisSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}

在这里插入图片描述

3. 对称二叉树🚀

  1. 对称二叉树

给你一个二叉树的根节点

root

, 检查它是否轴对称。

示例 1:

img

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

img

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路:对称与相同具有相似之处,只需要将上面递归的参数变成相对的即可,当然头结点为空也是对称的,为了这种情况,需要吧递归放到子函数中。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

bool balanceTree(struct TreeNode* left,struct TreeNode* right){if(left ==NULL&& right ==NULL){returntrue;}if(left ==NULL|| right ==NULL|| left->val != right->val){returnfalse;}returnbalanceTree(left->left,right->right)&&balanceTree(left->right,right->left);}
bool isSymmetric(struct TreeNode* root){if(root ==NULL)returntrue;returnbalanceTree(root->left,root->right);}

在这里插入图片描述

4. 二叉树的前序遍历🚀

  1. 二叉树的前序遍历

给你二叉树的根节点

root

,返回它节点值的 前序 遍历。

示例 1:

img

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

img

输入:root = [1,2]
输出:[1,2]

示例 5:

img

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

思路:通过之前对二叉树的学习我们知道二叉树前序遍历的逻辑,不过前者是直接打印,这道题则是需要返回一个数组,因此,我们需要计算其长度,开辟等大小的数组,并随着不断遍历一直++下标。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 *//**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int TreeSize(struct TreeNode* root){if(root ==NULL)return0;returnTreeSize(root->left)+TreeSize(root->right)+1;}voidpreorder(struct TreeNode* root,int* arr,int* pi){if(root ==NULL)return;
   
     arr[(*pi)]= root->val;(*pi)++;preorder(root->left,arr,pi);preorder(root->right,arr,pi);}
int*preorderTraversal(struct TreeNode* root, int* returnSize){
    
    int n =TreeSize(root);
    int* arr =(int*)malloc(sizeof(int)*n);
    int i =0;preorder(root,arr,&i);*returnSize = n;return arr;}

在这里插入图片描述

5. 二叉树的中序遍历🚀

  1. 二叉树的中序遍历

给定一个二叉树的根节点

root

,返回 它的 中序 遍历

示例 1:

img

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

与4题的思路一样,只不过是把前序变成中序

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 *//**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int TreeSize(struct TreeNode* root){if(root ==NULL)return0;returnTreeSize(root->left)+TreeSize(root->right)+1;}voidinorder(struct TreeNode* root,int* a,int* pi){if(root ==NULL)return;inorder(root->left,a,pi);
    a[(*pi)]= root->val;(*pi)++;inorder(root->right,a,pi);}
int*inorderTraversal(struct TreeNode* root, int* returnSize){
    int n =TreeSize(root);
    int* arr =(int*)malloc(sizeof(int)*n);*returnSize = n;

    int i=0;inorder(root,arr,&i);return arr;}

因此,后序遍历也就知道如何进行展开了,这里就不演示了。自己动手哦

  1. 二叉树的后序遍历

6. 另一棵树的子树🚀

  1. 另一棵树的子树

难度简单819收藏分享切换为英文接收动态反馈

给你两棵二叉树

root

subRoot

。检验

root

中是否包含和

subRoot

具有相同结构和节点值的子树。如果存在,返回

true

;否则,返回

false

二叉树

tree

的一棵子树包括

tree

的某个节点和这个节点的所有后代节点。

tree

也可以看做它自身的一棵子树。

示例 1:

img

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

img

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

提示:

  • root 树上的节点数量范围是 [1, 2000]
  • subRoot 树上的节点数量范围是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

思路:判断另一颗树是否是子树,无非就是在原树中遍历节点,直到这个节点为根的树与这个树相等即可,因此这里用到了第二题的函数。

/**
 * 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)returntrue;if(p ==NULL|| q ==NULL)returnfalse;if(p->val != q->val)returnfalse;returnisSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root ==NULL)returnfalse;if(isSameTree(root,subRoot))returntrue;returnisSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);}

7. 总结🚀

通过这几道的简单训练,算是对二叉树的一点巩固,难度大的题目将会在后续。

标签: leetcode 算法

本文转载自: https://blog.csdn.net/NEFUT/article/details/126831293
版权归原作者 每天都要进步呀~ 所有, 如有侵权,请联系我们删除。

“【LeetCode-二叉树训练】”的评论:

还没有评论