zoukankan      html  css  js  c++  java
  • 树的子结构(Python and C++解法)

    题目:

    输入两棵二叉树A和B,判断B是不是A的子结构。约定空树不是任意一个树的子结构。B是A的子结构, 即 A中有出现和B相同的结构和节点值。

    例如:
    给定的树 A:

          3
         /
       4   5
      /
    1   2
    给定的树 B:

       4 
      /
     1
    返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

    示例 1:

    输入:A = [1,2,3], B = [3,1]
    输出:false
    示例 2:

    输入:A = [3,4,5,1,2], B = [4,1]
    输出:true

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof

    思路:

      需要分两步完成:

      第一步:遍历树A 的节点,寻找与树B根节点相等的节点,如果找到了相等的节点,需要转入第二步判断。

      第二步:对步骤一中找到的相等节点的子节点,进行匹配,A的左子节点与B的左子节点匹配,A的右子节点与B的右子节点进行匹配。

    Python解法:

     1 class TreeNode:
     2     def __init__(self, x):
     3         self.val = x
     4         self.left = None
     5         self.right = None
     6 
     7 class Solution:
     8     def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
     9         result = False  # 树A为空或树B为空,空树不是任意一个树的子结构
    10         if A is not None and B is not None:
    11             if A.val == B.val:  # 找到了与树B根节点相等的节点
    12                 result = self.recur(A, B)  # 进行子树匹配
    13             if not result:  # 继续遍历树A的左子树,寻找与树B根节点相等的节点
    14                 result = self.isSubStructure(A.left, B)
    15             if not result:  # 继续遍历树A的右子树,寻找与树B根节点相等的节点
    16                 result = self.isSubStructure(A.right, B)
    17         return result
    18 
    19     def recur(self, A, B):
    20         if B is None:  # 树B已匹配完成(越过叶子节点)
    21             return True
    22         if A is None or A.val != B.val:  # 已经越过树A的叶节点,或子结构出现不相等的子节点
    23             return False
    24         return self.recur(A.left, B.left) and self.recur(A.right, B.right)  # 继续匹配子节点

    C++解法:

     1 struct TreeNode {
     2     int val;
     3     TreeNode *left;
     4     TreeNode *right;
     5     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     6 };
     7 
     8 class Solution {
     9 public:
    10     bool isSubStructure(TreeNode* A, TreeNode* B) {
    11         bool result = false;
    12         if (A != NULL && B != NULL) {
    13             if (A->val == B->val)
    14                 result = recurr(A, B);
    15             if (!result)
    16                 result = isSubStructure(A->left, B);
    17             if (!result)
    18                 result = isSubStructure(A->right, B);
    19         }
    20         return result;
    21     }
    22     bool recurr(TreeNode *A, TreeNode *B) {
    23         if (B == NULL)
    24             return true;
    25         if (A == NULL || A->val != B->val)
    26             return false;
    27         return recurr(A->left, B->left) && recurr(A->right, B->right);
    28     }
    29 };
  • 相关阅读:
    安装MSSQL2008出现的问题记录
    制作安装包遇到的问题
    算法设计方法动态规划
    基础果然要牢记(一次失败的电面)
    搜狗垂搜笔试
    几种堆的时间复杂度分析
    正则表达式转NFA
    组合数学(1)
    算法设计方法贪心算法
    最短路径问题
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13257263.html
Copyright © 2011-2022 走看看