zoukankan      html  css  js  c++  java
  • 剑指 Offer 26. 树的子结构

    代码分为两个部分:

    1. 遍历树A中的所有非空节点R;
    2. 判断树A中以R为根节点的子树是不是包含和树B一样的结构,且我们从根节点开始匹配;

    对于第一部分,我们直接递归遍历树A即可,遇到非空节点后,就进行第二部分的判断。

    对于第二部分,我们同时从根节点开始遍历两棵子树:

    • 如果树B中的节点为空,则表示当前分支是匹配的,返回true;
    • 如果树A中的节点为空,但树B中的节点不为空,则说明不匹配,返回false;
    • 如果两个节点都不为空,但数值不同,则说明不匹配,返回false;

    否则说明当前这个点是匹配的,然后递归判断左子树和右子树是否分别匹配即可;

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isSubStructure(TreeNode* pRoot1, TreeNode* pRoot2) {
            if (!pRoot1 || !pRoot2) return false;
            if (isPart(pRoot1, pRoot2)) return true;
            return isSubStructure(pRoot1->left, pRoot2) || isSubStructure(pRoot1->right, pRoot2); 
        }
        bool isPart(TreeNode* pRoot1, TreeNode* pRoot2) {
            if (pRoot2 == nullptr) return true;
            if (pRoot1 == nullptr) return false;
            if (pRoot1->val != pRoot2->val) return false;
            
            return isPart(pRoot1->left, pRoot2->left) && isPart(pRoot1->right, pRoot2->right);
        }
    };
    
  • 相关阅读:
    排序——快速排序
    文件操作(获取英文单词)
    两位整数变英文单词
    Doodle Poll 投票文档
    手机与笔记本蓝牙配对
    浏览器的断电续传功能
    3ds max 2011 安装步骤及其注意事项
    anti-alising的基本理解
    OpenGL pipeline (very important)
    secureCrt
  • 原文地址:https://www.cnblogs.com/fxh0707/p/15048205.html
Copyright © 2011-2022 走看看