100.相同的数
题目:
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
思路:(深度优先搜索)
如果两个二叉树都为空:则两个二叉树相同。
如果两个二叉树中有且只有一个为空:则两个二叉树一定不相同。
如果两个二叉树都不为空:(那么首先判断它们的根节点的值是否相同)
若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
代码实现:
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);
}
101.对称二叉树
题目:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例:
思路:
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。(即左子树与右子树左右对调)
因此,该问题可以转化为:满足以下条件即对称
它们的两个根结点具有相同的值
每个树的右子树都与另一个树的左子树镜像对称
我们可以将以上判断相同树的代码进行更改即可实现该判断:
算法实现:
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->right) && isSameTree(p->right, q->left);
}
bool isSymmetric(struct TreeNode* root) {
if(root==NULL){
return true;
}
return isSameTree(root->left,root->right);
}