树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
我的解答
题意
这道题目我是在牛客网上做的,题目叙述过于简答,坑了我半天,我的理解是一棵树要成为另一棵树的子树,必须从相同的节点开始,下面都相同。但是题目是只要可以将子树映射到主树中就可以了,树的下面可以不同。详见我下面的这张图。
我的解答
其实这道题目也没什么其他思路,是一道训练基本功的题目:建树,(遍历),对比两棵树。这里建树的过程就不赘述了,我就说说如果判断子树,首先递归遍历,如果碰到相同的节点,则调用另一个函数,这个函数就是我下面写的CompareTree函数,我都注释了,强调第一个和第二个判空语句不可以互换,大家写的时候多思考一下。还有一点需要强调,可能我对于树的递归理解不深,在HasSubtree的函数里我没写“result =”。如果不写,会返回false,因为你的判断成功的值没有赋给result,(在递归返回的过程中)所以切记切记不要漏了,我对于这题的理解大概就是这样,比较菜,希望指正。
//
// main.cpp
// offer17_pro
//
// Created by 李林 on 16/7/20.
// Copyright © 2016年 李林. All rights reserved.
//
#include <iostream>
#include <cstdio>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
bool CompareTree(TreeNode* root1, TreeNode* root2){
//root2是NULL,root1无论是什么情况,root2都是他子树了。
if(root2==NULL) return true;
//root2不是NULL,但是root1是NULL,不是子树
if(root1==NULL) return false;
if(root1->val != root2->val)
return false;
//左右子树都要相等,方可称之为子树。
return CompareTree(root1->left, root2->left)
&& CompareTree(root1->right, root2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
bool result = false;
if(pRoot1!=NULL && pRoot2!=NULL){
//成功就让result出来。
if(pRoot1->val==pRoot2->val)
result = CompareTree(pRoot1, pRoot2);
if(result==false)
result = HasSubtree(pRoot1->left, pRoot2);
if(result==false)
result = HasSubtree(pRoot1->right, pRoot2);
}
return result;
}
TreeNode* Insert(TreeNode *root, int value){
if(root==NULL)
root = new TreeNode(value);
else{
//不能遗漏root->left
if(root->val > value)
root->left = Insert(root->left, value);
else
root->right = Insert(root->right, value);
}
return root;
}
void Traverse(TreeNode* root){
if(root->left != NULL) Traverse(root->left);
printf("%d ", root->val);
if(root->right != NULL) Traverse(root->right);
}
};
int main() {
Solution s;
TreeNode *root1 = NULL, *root2 = NULL;
int array1[] = {0,4,2,6,1,3,5,7};
int array2[] = {0,2,1,3};
for(int i=1; i<=7; i++)
root1 = s.Insert(root1, array1[i]);
for(int i=1; i<=3; i++)
root2 = s.Insert(root2, array2[i]);
s.Traverse(root1);
s.Traverse(root2);
bool flag = s.HasSubtree(root1, root2);
printf("\n%d", flag);
return 0;
}