剑指offer 树的子结构

树的子结构

题目描述

输入两棵二叉树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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值