大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在
CSDN
这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!
目录
- 1.单值二叉树
- (1)题目描述
- (2)解题思路
- 2.二叉树的最大深度
- (1)题目描述
- (2)解题思路
- 3.翻转二叉树
- (1)题目描述
- (2)解题思路
- 4.相同的数
- (1)题目描述
- (2)解题思路
- 快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!
废话不多说,我们直接看题。
1.单值二叉树
(1)题目描述
(2)解题思路
- 简单递归一一比较就行就行。
代码实现:
bool isUnivalTree(struct TreeNode* root) {if(NULL == root) return true;else if(root->left && root->val != root->left->val) return false;else if(root->right && root->val != root->right->val) return false;else return isUnivalTree(root->left) && isUnivalTree(root->right);
}
2.二叉树的最大深度
(1)题目描述
(2)解题思路
- 如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为
max(l,r)+1
。而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。
代码实现:
int maxDepth(struct TreeNode* root) {if(root == NULL) return 0;int leftheight = maxDepth(root->left);int rightheight = maxDepth(root->right);return ((leftheight > rightheight ? leftheight : rightheight) + 1);
}
3.翻转二叉树
(1)题目描述
(2)解题思路
- 这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root 为根节点的整棵子树的翻转。
代码实现:
struct TreeNode* invertTree(struct TreeNode* root) {if(root == NULL) return NULL;struct TreeNode* temp = root->left;root->left = root->right;root->right = temp;invertTree(root->left);invertTree(root->right);return root;
}
4.相同的数
(1)题目描述
(2)解题思路
- 如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
- 如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
代码实现:
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if (p == NULL && q == NULL) {return true;} else if (p == NULL || q == NULL) {return false;} else if (p->val != q->val) {return false;} else {return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);}
}