zoukankan      html  css  js  c++  java
  • 16 树的子结构(这题多复习)

    题目描述

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
     
    这题分两步:
      第1:在树A中找到和树B的根节点的值一样的节点R,注意树的节点值可以有多个相同的值。
      第2:判断树A中以R为根节点的子树是不是包含和B一样的树结构。
    这题难在递归基和判断树节点为空该返回什么,一定要记清楚找头结点的时候遇到空节点就返回错,helper函数如果子树为空,还有就是result的使用。
    说明已经匹配完了,返回true;如果是树A为空,说明匹配不到子树,返回false。
     
    理解难点:helper每次返回以该根节点开始的是否匹配,然后判断左子树和右子树是否匹配。
     
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool helper(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot2 == nullptr){
                return true;
            }
            if(pRoot1 == nullptr){
                return false;
            }
            if(pRoot1 -> val != pRoot2 -> val){
                return false;
            }
            return helper(pRoot1 -> left,pRoot2 -> left) && helper(pRoot1 -> right,pRoot2 -> right);
        }
        
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot1 == nullptr || pRoot2 == nullptr){
                return false;
            }
            bool result = false;
            if(pRoot1 -> val == pRoot2 -> val){
                result = helper(pRoot1,pRoot2);
            }
            if(!result){
                result = helper(pRoot1 -> left,pRoot2);
            }
            if(!result){
                result = helper(pRoot1 -> right,pRoot2);
            }
            return result;
        }
    };
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool helper(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot2 == nullptr){
                return true;
            }
            if(pRoot1 == nullptr){
                return false;
            }
            if(pRoot1 -> val != pRoot2 -> val){
                return false;
            }
            return helper(pRoot1 -> left,pRoot2 -> left) && helper(pRoot1 -> right,pRoot2 -> right);
        }
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot1 == nullptr || pRoot2 == nullptr){
                return false;
            }
           
            if(pRoot1 -> val == pRoot2 -> val){
                if(helper(pRoot1,pRoot2)){
                    return true;
                }
            }
            return helper(pRoot1 -> left,pRoot2) ||  helper(pRoot1 -> right,pRoot2);
            
        }
    };
  • 相关阅读:
    apollo使用场景2
    我问问
    洛谷 P3979 遥远的国度
    小技巧—对拍和输出文件的比较
    洛谷 P6850 NOI
    小技巧—双向边快速枚举
    ZJOI 2008 骑士
    小技巧—指数形式的枚举
    小技巧—滚动数组
    刷题心得—背包问题的枚举方式
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7932038.html
Copyright © 2011-2022 走看看