面试题26.树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
- 解题思路:
子树的意思是只要包含了一个结点,就得包含这个结点下的所有节点。
子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。
简单而言,与子树不同的是,子结构可以是树的任意一部分。
示例:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2 == NULL || pRoot1 == NULL )
return false;
return isSubtree(pRoot1, pRoot2)|| HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
}
bool isSubtree(TreeNode* pRoot1 , TreeNode* pRoot2){
if(pRoot2 == NULL)
return true;
if(pRoot1 == NULL)
return false;
return pRoot1->val == pRoot2->val && isSubtree(pRoot1->left,pRoot2->left) && isSubtree(pRoot1->right,pRoot2->right);
}
};
面试题27.二叉树的镜像
题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像。
示例:
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
- 解题思路:交换树的左右子树的指针
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot==NULL)
return;
stack<TreeNode*> stackNode;
stackNode.push(pRoot);
while(stackNode.size()){
TreeNode* tree=stackNode.top();
stackNode.pop();
if(tree->left!=NULL || tree->right!=NULL){
TreeNode *ptemp=tree->left;
tree->left=tree->right;
tree->right=ptemp;
}
if(tree->left)
stackNode.push(tree->left);
if(tree->right)
stackNode.push(tree->right);
}
}
};