一、单值二叉树
题目链接:力扣
对于这道题,我们可以采用遍历的一遍的方法。这样的话很简单。但是如果题目不要求遍历呢?我们就得需要采用分治的思想了,我们是这样做的,先让根和左子树和右子树的节点比较。如果不相同则返回false,如果相同,则让左子树和右子树分别与他们的左右子树进行比较即可
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ 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); }
二、相同的树
题目链接:力扣
对于这道题,我们仍然采用分治的思想,我们先处理特殊情况,如果两个树都是空树,返回true,如果一个是空一个不是空,返回false。如果两个树的值不同返回false,然后对左子树和右子树使用同样的判断逻辑即可
/** * 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); }
三、翻转二叉树
题目链接:力扣
对于这道题,我们仍然是采用分治的思想,大问题化成小问题,我们先将左右子树反转,然后继续反转左子树和右子树的子树。注意只有当左右结点至少存在一个时才需要翻转。左右孩子结点都不存在,就不需要反转。遇到空的时候,直接返回空拦截即可
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ typedef struct TreeNode TreeNode; struct TreeNode* invertTree(struct TreeNode* root){ if(root==NULL) { return NULL; } if(root->left||root->right) { TreeNode* tmp=root->left; root->left=root->right; root->right=tmp; } invertTree(root->left); invertTree(root->right); return root; }
四、对称二叉树
题目链接:力扣
对于这道题,我们最容易的方法就是先翻转左或右子树,然后判断是否为相同的树即可
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ typedef struct TreeNode TreeNode; struct TreeNode* invertTree(struct TreeNode* root){ if(root==NULL) { return NULL; } if(root->left||root->right) { TreeNode* tmp=root->left; root->left=root->right; root->right=tmp; } invertTree(root->left); invertTree(root->right); return root; } bool isSameTree(TreeNode* p,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 isSymmetric(struct TreeNode* root){ if(root==NULL) { return true; } invertTree(root->left); return isSameTree(root->left,root->right); }
五、二叉树的先序遍历
题目链接:力扣
这道题的本质是先序遍历,但是与我们之前的有所不同,这道题要求的是存储在一个数组中。所以我们就将打印改为赋值即可
/** * 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) { return 0; } return 1+TreeSize(root->left)+TreeSize(root->right); } void _prevOrder(struct TreeNode* root,int* a,int* pi) { if(root==NULL) { return; } a[*pi]=root->val; (*pi)++; _prevOrder(root->left,a,pi); _prevOrder(root->right,a,pi); } int* preorderTraversal(struct TreeNode* root, int* returnSize){ int k=TreeSize(root); int* a=(int*)malloc(sizeof(int)*k); *returnSize=k; int i=0; _prevOrder(root,a,&i); return a; }
六、另一颗树的子树
题目链接:力扣
对于这道题,与前面判断相同的树异曲同工之妙,我们需要做的就是将每一个节点都与另外一颗树进行判断是否为相同的树。
/** * 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) { return false; } if(isSameTree(root,subRoot)) { return true; } return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot); }
本期内容就到这里了
如果对你有帮助的话,不要忘记点赞加收藏哦!!!