
🎬 博主名称 :键盘敲碎了雾霭
🔥 个人专栏 : 《C语言》《数据结构》
⛺️指尖敲代码,雾霭皆可破

文章目录
- 一、单值二叉树
-
- [1.1 题目描述](#1.1 题目描述)
- [1.2 解题思想](#1.2 解题思想)
- [1.3 代码实现](#1.3 代码实现)
- 二、相同的树
-
- [2.1 题目描述](#2.1 题目描述)
- [2.2 解题思想](#2.2 解题思想)
- [2.3 代码实现](#2.3 代码实现)
- 三、对称二叉树
-
- [3.1 题目描述](#3.1 题目描述)
- [3.2 解题思想](#3.2 解题思想)
- [3.3 代码实现](#3.3 代码实现)
- 四、二叉树的前序遍历
-
- [4.1 题目描述](#4.1 题目描述)
- [4.2 解题思想](#4.2 解题思想)
- [4.3 代码实现](#4.3 代码实现)
- 五、另一棵树的子树
-
- [5.1 题目描述](#5.1 题目描述)
- [5.2 解题思想](#5.2 解题思想)
- [5.3 代码实现](#5.3 代码实现)
- 六、二叉树遍历
-
- [6.1 题目描述](#6.1 题目描述)
- [6.2 解题思想](#6.2 解题思想)
- [6.3 代码实现](#6.3 代码实现)
- 七、是否为平衡二叉树
-
- [7.1 题目描述](#7.1 题目描述)
- [7.2 解题思想](#7.2 解题思想)
- [7.3 代码实现](#7.3 代码实现)
一、单值二叉树
1.1 题目描述
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
原题链接:965.单值二叉树
1.2 解题思想
每棵树都与左子树与右子树进行比较,遇到空返回真,依次往下递归
1.3 代码实现
c
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);
}
二、相同的树
2.1 题目描述
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
原题链接:100.相同的树
2.2 解题思想
拆为左子树与左子树相同,右子树与右子树相同
2.3 代码实现
c
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);
}
三、对称二叉树
3.1 题目描述
给你一个二叉树的根节点 root , 检查它是否轴对称。
原题链接:101.对称二叉树
3.2 解题思想
在相同树的基础上变为左子树与右子树比较
3.3 代码实现
c
bool isSame(struct TreeNode* root1,struct TreeNode* root2)
{
if(root1==NULL&&root2==NULL)
{
return true;
}
if(root1==NULL||root2==NULL)
{
return false;
}
if(root1->val!=root2->val)
{
return false;
}
return isSame(root1->left,root2->right)&&isSame(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root)
{
return isSame(root->left,root->right);
}
四、二叉树的前序遍历
4.1 题目描述
给你二叉树的根节点 root ,返回它节点值的 前序 遍历
原题链接:144.二叉树的前序遍历
4.2 解题思想
传下标时要传地址进去
4.3 代码实现
c
int CountSize(struct TreeNode* root)
{
if(root==NULL)
{
return 0;
}
return CountSize(root->left)+CountSize(root->right)+1;
}
void PreOrder(int *arr,int *pi,struct TreeNode* root)
{
if(root==NULL)
{
return;
}
arr[(*pi)++]=root->val;
PreOrder(arr,pi,root->left);
PreOrder(arr,pi,root->right);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
*returnSize=CountSize(root);
int *arr =malloc(sizeof(int)*(*returnSize));
int i=0;
PreOrder(arr,&i,root);
return arr;
}
五、另一棵树的子树
5.1 题目描述
给你两棵二叉树 root 和具有相同结构和节点值的子树。如果存在,返回true ;否则,返回false 二叉树 tree 的一棵子树包括 tree的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
原题链接:572.另一棵树的子树
5.2 解题思想
依次遍历,子树是否相等
5.3 代码实现
c
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;
}
if(root->val==subRoot->val&&isSameTree(root,subRoot))
{
return true;
}
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
六、二叉树遍历
6.1 题目描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中"#"表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
原题链接:TSINGK110 二叉树遍历
6.2 解题思想
递归思想、前序创建,中序遍历
6.3 代码实现
c
#include <stdio.h>
#include<stdlib.h>
typedef struct BTNode
{
char val;
struct BTNode*left;
struct BTNode*right;
}BTNode;
BTNode* GreatTree(char*arr,int *pi)
{
BTNode*root=(BTNode*)malloc(sizeof(BTNode));
if(arr[(*pi)]=='#')
{
root=NULL;
(*pi)++;
return NULL;
}
root->val= arr[(*pi)++];
root->left=GreatTree(arr,pi);
root->right=GreatTree(arr,pi);
return root;
}
void InOrder(char *arr,int *pi,struct BTNode* root)
{
if(root==NULL)
{
return;
}
InOrder(arr,pi,root->left);
printf("%c ",root->val);
InOrder(arr,pi,root->right);
}
int main()
{
char arr[100]={0};
scanf("%s",arr);
int i=0;
BTNode*root = GreatTree(arr,&i);
i=0;
InOrder(arr,&i,root);
}
七、是否为平衡二叉树
7.1 题目描述
给定一个二叉树,判断它是否是 平衡二叉树
原题链接:110.平衡二叉树
7.2 解题思想
- 判断以根结点的树是否为二叉平衡树。求出左右子树的高度,判断它们的高度差是否超过了1。
- 递归判断根的左子树是否为平衡二叉树
- 递归判断根的右子树是否为平衡二叉树
注意:空树也是平衡二叉树
7.3 代码实现
c
int TreeHigh(struct TreeNode* root)
{
if(root==NULL)
{
return 0;
}
int left =TreeHigh(root->left);
int right=TreeHigh(root->right);
return left>right?left+1:right+1;
}
bool isBalanced(struct TreeNode* root)
{
if(root==NULL)
{
return true;
}
int left=TreeHigh(root->left);
int right=TreeHigh(root->right);
if(abs(left-right)>1)
{
return false;
}
return isBalanced(root->left)&&isBalanced(root->right);
}