delphi 判断结构体不为空_Day17:树的子结构

ded72c1f6607e80f57a253479cb750b5.png

剑指Offer_编程题——树的子结构

题目描述:

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

具体要求:

时间限制: C/C++ 1秒,其他语言2秒
空间限制: C/C++32M,其他语言64M

具体思路:

对于二叉树来说遍历的时候最好是利用递归的方法。

1、首先设置标志位result = false,因为一旦匹配成功result就设为true。剩下的代码不会被执行。如果匹配不成功,默认返回false

2、利用递归的思想:如果根节点相同则递归调用DoesTree1HaveTree2(),如果根节点不同,则判断tree1的左子树和tree2是否相同,再判断右子树是否和tree2相同

3、注意null的条件,在HasSubTree中,如果两棵树都不为空才进行判断,DoesTree1HaveTree2中,如果Tree2为空,则说明第二棵树遍历完了,则匹配成功。

当然tree1为空有两种情况:

① 如果tree1为空 && tree2不为空说明不匹配。

② 如果tree1为空 && tree2也为空,说明匹配。

具体用Java实现该思路如下:

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        boolean result = false;
        if(root2 != null && root1 != null){
            if(root1.val == root2.val)
                result = doesTree1HaveTree2(root1, root2);
            if (!result)
                result = HasSubtree(root1.left, root2);
            if(!result)
                result = HasSubtree(root1.right, root2);
        }
            return result;
    }
    public static boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2){
        if(node2 == null)
            return true;
        if(node1 == null)
            return false;
        if(node1.val != node2.val)
            return false;
        return doesTree1HaveTree2(node1.left, node2.left) && doesTree1HaveTree2(node1.right, node2.right);
    }
}

代码效果图如图所示:

e3982d95f6bed2d880cb3d4a2cd07ddf.png

正如前面提到一样,牛客网已经为我们定义了节点,不需要我们重复定义,但是在自己的本地编译器中,我们需要定义节点TreeNode的类,具体实现如下:

public class TreeNode{
   int val = 0;
   TreeNode left = null;
   TreeNode right = null;
   public TreeNode(int val){
     this.val = val;
   }
}

具体用python实现:

class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if not pRoot1 or not pRoot2:
            return False
        return self.is_subtree(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)
     
    def is_subtree(self, A, B):
        if not B:
            return True
        if not A or A.val != B.val:
            return False
        return self.is_subtree(A.left,B.left) and self.is_subtree(A.right, B.right)

代码效果图如图所示:

00a439cd481cc02b01002fe164d27bfb.png

用python实现树结构:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

总结

本道题主要考察树的子结构,通过定义一个树的结构,利用递归来进行二叉树的遍历,不过需要注意的是:tree1为空的两种情况,如果在tree1为空的同时tree2也为空,即匹配成功。否则匹配失败。在数据结构中,树的实现就比较难了,不过应用也是挺广的。因此我们要熟悉掌握这块的知识点。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

在Go语言中,判断一个结构体实例是否通常指的是判断该实例的所有字段是否都是零值。零值是指一个变量未被显式赋值时的默认值,对于不同的数据类型,零值是不同的,例如,数值类型为0,布尔类型为false,字符串类型为字符串""。 以下是几种判断结构体是否的方法: 1. 遍历结构体的所有字段,逐一判断每个字段的值是否为零值。这种方法虽然准确,但在字段较多的情况下比较繁琐。 2. 利用反射(reflection)包中的API来判断结构体是否。可以使用`reflect.DeepEqual`函数来判断一个结构体实例是否等于零值实例。这种方法编写起来相对简单,但需要注意反射的性能开销可能较大。 3. 对于简单的结构体,可以通过逐个字段进行比较的方式来判断,尤其是当结构体中包含非基本类型字段时,反射可能不是最佳选择。 示例代码(使用反射判断结构体是否): ```go package main import ( "fmt" "reflect" ) type MyStruct struct { Field1 string Field2 int Field3 bool } func main() { var myStruct MyStruct fmt.Println(isEmptyStruct(myStruct)) // 输出: true myStruct = MyStruct{ Field1: "hello", Field2: 100, Field3: true, } fmt.Println(isEmptyStruct(myStruct)) // 输出: false } func isEmptyStruct(s interface{}) bool { // 判断传入的值是否是nil指针 if s == nil { return true } // 通过反射获取值的类型 val := reflect.ValueOf(s) // 判断是否是一个结构体 if val.Kind() == reflect.Struct { // 遍历结构体的所有字段 for i := 0; i < val.NumField(); i++ { // 获取字段的值 fieldVal := val.Field(i) // 如果字段的值不是零值,则返回false if !fieldVal.IsZero() { return false } } // 所有字段都是零值,返回true return true } return false } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值