题单:
一,相同的树
题目:
给你两棵二叉树的根节点
p
和q
,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
题目接口:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
}
分析:
要判断两棵树是否相同,首先就要判断根节点是否相同:
1.当两棵树的根节点都为NULL时返回true。
2.当两棵树的根节点一个为NULL一个不为NULL时返回false。
3.当两棵树根节点都不为NULL时并且节点的值不相等时返回false。
当根节点相同时,继续判断左右子树。左右子树都相同时返回true。
解题代码:
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);
}
二,单值二叉树
题目:
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回
true
;否则返回false
。
接口:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isUnivalTree(struct TreeNode* root){
}
分析:
判断是否是单值二叉树关键就在于一整棵树的每一个节点的值都是一样的。所以我们需要将每一个节点的值与它们的根节点进行比较。当根节点没有左右节点时返回true,当根节点的左右节点与根节点的值不相同时返回false。
代码:
bool isUnivalTree(struct TreeNode* root){
if(root==NULL)
return true;
if(root->left==NULL&&root->right==NULL)
return true;
if(root->left!=NULL&&root->left->val!=root->val)
return false;
if(root->right!=NULL&&root->right->val!=root->val)
return false;
return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
三,对称二叉树
题目:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1
/ \
2 2
\ \
3 3
接口:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSymmetric(struct TreeNode* root){
}
分析:
判断镜像二叉树:
1.当根节点为NULL时直接返回true表示这是一棵镜像二叉树
2.当根节点不为NULL时便对左右节点进行判断。
比如这棵树:
1
/ \
2 2
/ \ / \
3 4 4 3这棵树的根节点不为NULL,所以我们便对左右节点进行判断,左右节点相同便对左的左与右的右,右的左与左的右进行判断。
代码:
bool isSymmetric_(struct TreeNode* left,struct TreeNode* right)
{
if(left==NULL&&right==NULL)
return true;
if(left==NULL||right==NULL)
return false;
if(left->val!=right->val)
return false;
return isSymmetric_(left->left,right->right)&&isSymmetric_(left->right,right->left);
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL)
return true;
return isSymmetric_(root->left,root->right);
}
四,二叉树的前序遍历
题目:
给你二叉树的根节点
root
,返回它节点值的 前序 遍历。
接口:
/**
* 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* preorderTraversal(struct TreeNode* root, int* returnSize){
}
分析:
二叉树的前序遍历是一个较为简单的题目,但是要注意的是当你在使用递归来做这道题时传的下标的地址而不能直接传指针的值。
代码:
/**
* 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 numsSize(struct TreeNode* root)//计算节点数
{
if(root==NULL)
return 0;
return numsSize(root->left)+numsSize(root->right)+1;
}
void preorderTraversal_(int* a,int*numsSize,struct TreeNode* root)//实现前序遍历
{
if(root == NULL)
return ;
a[(*numsSize)++] = root->val;
preorderTraversal_(a,numsSize,root->left);
preorderTraversal_(a,numsSize,root->right);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int n = numsSize(root);//计算个数
int* a =(int*) malloc(sizeof(int)*n);//malloc出来一个数组
*returnSize = 0;
preorderTraversal_(a,returnSize,root);//前序遍历
return a;
}
五,二叉树的子树
题目:
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
接口:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
}
分析:
寻找二叉树的子树。先写一个判断两棵树是否相同的数的函数,然后对判断从根节点处开始的树是否与子树相同。如果不同就比较左子树与右子树。
代码:
/**
* 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)
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&&subRoot==NULL)
return true;
if(root==NULL||subRoot==NULL)
return false;
return isSameTree(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}