室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈.

叮叮叮当QQ响起会是谁呢
NaYo

文章目录

  • 1.单值二叉树
    • 1.1题目描述
    • 1.2 思路
    • 1.3 代码演示
  • 2.相同的树
    • 2.1题目描述
    • 2.2 思路
    • 2.3 代码演示
  • 3.对称二叉树
    • 3.1题目描述
    • 3.2 思路
    • 3.3 代码演示
  • 4.二叉树的前序遍历
    • 4.1题目描述
    • 4.2 思路
    • 4.3 代码演示
  • 5.二叉树的中序遍历
    • 5.1题目描述
    • 5.2 思路
    • 5.3 代码演示
  • 6.二叉树的后序遍历
    • 6.1题目描述
    • 6.2 思路
    • 6.3 代码演示
  • 7.另一颗树的子树
    • 7.1题目描述
    • 7.2 思路
    • 7.3 代码演示
  • ❤️8.总结

1.单值二叉树

题目链接

1.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第1张图片

1.2 思路

如果根是空,那么return true;如果根不是空,那我们再继续比较根和它的左子树、右子树。注意不要比较相等,因为相等并不能得到结果,并不能说明树是单值二叉树,还要继续递归往下走。如果每个根和它的左右孩子都相等,说明这是一颗单值二叉树。

1.3 代码演示

bool isUnivalTree(struct TreeNode* root){
    if(root == NULL)
    return true;
    if(root->left && root->val != root->left->val)
    return false;
    if(root->right && root->val != root->right->val)
    return false;
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第2张图片

2.相同的树

题目链接

2.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第3张图片

2.2 思路

一棵树分成三个部分进行比较:根、左子树、右子树。左右子树又可以分为根、左子树、右子树。直到NULL结束。

2.3 代码演示

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);
}

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第4张图片

3.对称二叉树

题目链接

3.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第5张图片

3.2 思路

没有必要比较根,我的左子树和你的右子树进行比较,我的右子树和你的左子树进行比较。写一个_isSymmetric子函数来比较。

3.3 代码演示

bool _isSymmetric(struct TreeNode*p,struct TreeNode*q)
{
     if(p== NULL && q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    return p->val==q->val
    &&_isSymmetric(p->left,q->right)
    &&_isSymmetric(p->right,q->left);
}

bool isSymmetric(struct TreeNode* root){
    if(root==NULL)
    return true;
    return _isSymmetric(root->left,root->right);
}

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第6张图片

4.二叉树的前序遍历

题目描述

4.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第7张图片

4.2 思路

return一个前序遍历的数组,且这个数组必须是被malloc的。

  1. 写一个TreeSize先来计算二叉树的大小
  2. 写一个_preorder来实现前序遍历,并把前序遍历的结果存在一个数组里

int *pi, int *returnSize为输出型参数。

4.3 代码演示

 int TreeSize(struct TreeNode* root)
 {
     return root == NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }

 void _preorder(struct TreeNode* root,int* a,int *pi)
 {
     if(root==NULL)
     return;
     a[(*pi)++]=root->val;
     _preorder(root->left,a,pi);
     _preorder(root->right,a,pi);

 }
int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int size=TreeSize(root);
    int *a = malloc(sizeof(int)*size);
    *returnSize = size;
    int i = 0;
    _preorder(root,a,&i);
    return a;
}

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第8张图片

5.二叉树的中序遍历

题目链接

5.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第9张图片

5.2 思路

return一个中序遍历的数组,且这个数组必须是被malloc的。

  1. 写一个TreeSize先来计算二叉树的大小
  2. 写一个_inorder来实现前序遍历,并把中序遍历的结果存在一个数组里

int *pi, int *returnSize为输出型参数。

5.3 代码演示

int TreeSize(struct TreeNode* root)
 {
     return root == NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }

void _inorder(struct TreeNode* root,int* a,int *pi)
 {
     if(root==NULL)
     return;
     _inorder(root->left,a,pi);
     a[(*pi)++]=root->val;
     _inorder(root->right,a,pi);
 }

int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int size=TreeSize(root);
    int *a = malloc(sizeof(int)*size);
    *returnSize = size;
    int i = 0;
    _inorder(root,a,&i);
    return a;
}

6.二叉树的后序遍历

题目描述

6.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第10张图片

6.2 思路

return一个后序遍历的数组,且这个数组必须是被malloc的。

  1. 写一个TreeSize先来计算二叉树的大小
  2. 写一个_postorder来实现前序遍历,并把后序遍历的结果存在一个数组里

int *pi, int *returnSize为输出型参数。

6.3 代码演示

int TreeSize(struct TreeNode* root)
 {
     return root == NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }

  void _postorder(struct TreeNode* root,int* a,int *pi)
 {
     if(root==NULL)
     return;
     _postorder(root->left,a,pi);
     _postorder(root->right,a,pi);
     a[(*pi)++]=root->val;
 }

int* postorderTraversal(struct TreeNode* root, int* returnSize){
    int size=TreeSize(root);
    int *a = malloc(sizeof(int)*size);
    *returnSize = size;
    int i = 0;
    _postorder(root,a,&i);
    return a;
}

7.另一颗树的子树

题目链接

7.1题目描述

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第11张图片

7.2 思路

左边树中每一颗子树都比较一下isSameTree。
遍历树,树中每个节点所在的子树,都跟subRoot进行一下比较即可。

7.3 代码演示

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);
}

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

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第12张图片

❤️8.总结

觉得有收获的话,一键三连支持博主哦

室友不在家,打开LeetCode来一次题库屠杀.手把手带你刷二叉树基础OJ题,请不要学得太激烈._第13张图片

你可能感兴趣的:(数据结构(C语言实现),数据结构,c语言)