叮叮叮当QQ响起会是谁呢
NaYo
题目链接
如果根是空,那么return true;
如果根不是空,那我们再继续比较根和它的左子树、右子树。注意不要比较相等,因为相等并不能得到结果,并不能说明树是单值二叉树,还要继续递归往下走。如果每个根和它的左右孩子都相等,说明这是一颗单值二叉树。
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);
}
题目链接
一棵树分成三个部分进行比较:根、左子树、右子树。左右子树又可以分为根、左子树、右子树。直到NULL结束。
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);
}
题目链接
没有必要比较根,我的左子树和你的右子树进行比较,我的右子树和你的左子树进行比较。写一个_isSymmetric子函数来比较。
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);
}
题目描述
return一个前序遍历的数组,且这个数组必须是被malloc的。
int *pi, int *returnSize为输出型参数。
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;
}
题目链接
return一个中序遍历的数组,且这个数组必须是被malloc的。
int *pi, int *returnSize为输出型参数。
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;
}
题目描述
return一个后序遍历的数组,且这个数组必须是被malloc的。
int *pi, int *returnSize为输出型参数。
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;
}
题目链接
左边树中每一颗子树都比较一下isSameTree。
遍历树,树中每个节点所在的子树,都跟subRoot进行一下比较即可。
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);
}
觉得有收获的话,一键三连支持博主哦