zoukankan      html  css  js  c++  java
  • 剑指offer 18:树的子结构

    题目描述

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    解题思路

    验证B是不是A的子树,直觉做法,按照任意次序遍历A树,一旦出现和B树根节点相同的子节点,就将以此节点为根的子树与B树相比较,满足则查找成功,否则查找失败。树的先序遍历最为直观,此处以先序遍历为例,给出C++实现代码:

    /*
    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)
        {       bool isSub=false;
               //出现两树中有任意一个为空,则返回false
               if(pRoot1!=NULL && pRoot2!=NULL){
                   if(pRoot1->val==pRoot2->val){
                       isSub=doesTree1HaveTree2(pRoot1,pRoot2);
                   }if(!isSub){
                       isSub=HasSubtree(pRoot1->left,pRoot2);
                   }if(!isSub){
                      isSub=HasSubtree(pRoot1->right,pRoot2); 
                   }
               }
             return isSub;
        }
        bool doesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot2==NULL){
                return true;
            }
            if(pRoot1==NULL){
                return false;
            }
            if(pRoot1->val!=pRoot2->val){
                return false;
            }
            return doesTree1HaveTree2(pRoot1->left,pRoot2->left) && doesTree1HaveTree2(pRoot1->right,pRoot2->right);
        }
    };
  • 相关阅读:
    「题解」:$Six$
    「题解」:$Smooth$
    AFO
    纪念——代码首次达到近50K(更新:78.8K 2019行)
    meet-in-the-middle 基础算法(优化dfs)
    莫队学习笔记
    树链剖分学习笔记
    常用数论模板
    图论模板
    高精度模板(结构体封装,重载运算符)
  • 原文地址:https://www.cnblogs.com/fancy-li/p/11616199.html
Copyright © 2011-2022 走看看