题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路:有两点需要注意的,一是可以再添加一个函数,该函数用于判断两子树以当前点作为根节点是否相互包含。另外需要注意的是,递归的部分可以做一点优化,如果左子树已经包含了pRoot2,则可以不用再判断右子树而直接得出结果。
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL||pRoot2==NULL) return false;
bool res;
if(Equaltree(pRoot1,pRoot2))
{
res = true;
}
else
{
res = HasSubtree(pRoot1->left,pRoot2);
if(!res) res = HasSubtree(pRoot1->right,pRoot2); //如果上面已经包含了,则此条语句不执行
}
return res;
}
bool Equaltree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2==NULL) return true;
if(pRoot1==NULL) return false;
bool res;
if(pRoot1->val == pRoot2->val)
{
res = Equaltree(pRoot1->left,pRoot2->left)&&Equaltree(pRoot1->right,pRoot2->right);
}
else res = false;
return res;
}
};
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
解题思路:比较常规的可以用递归思想解决的问题,但是要注意二叉树不一定每个子节点都有两个字树或者没有,也有可能只有一个子树。
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot==NULL) return;
if(pRoot->left==NULL&&pRoot->right==NULL) return; //这里一定用的是&&,二叉树并非一定有两个子树。
Mirror(pRoot->left);
Mirror(pRoot->right);
TreeNode *tmp;
tmp = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = tmp;
return;
}
};