二叉树上的相等子树

简介: 二叉树上的相等子树

题目

如果一个节点X,它左树结构和右树结构完全一样
那么我们说以X为头的树是相等树
给定一棵二叉树的头节点head
返回head整棵树上有多少棵相等子树

一、暴力解

以x为头的整颗树有多少颗相等子树
可能性
1)左树上有多少颗相等子树+右树上有多少颗相等子树,验证自己是不是相等子树,需要验证左树的结构是否等于右树的结构
定义函数same:你给我一个节点h1,再给我节点h2,告诉你h1的结构跟h2结构相不相等。
整体调用递归sum函数:以x为头的整颗树有多少颗相等子树

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int v) {
            value = v;
        }
    }

    // 时间复杂度O(N * logN)
    public static int sameNumber1(Node head) {
        if (head == null) {
            return 0;
        }
        return sameNumber1(head.left) + sameNumber1(head.right) + (same(head.left, head.right) ? 1 : 0);
    }
    //判断两颗子树是否是否相等
    public static boolean same(Node h1, Node h2) {
        if (h1 == null ^ h2 == null) {
            return false;
        }
        if (h1 == null && h2 == null) {
            return true;
        }
        // 两个都不为空
        return h1.value == h2.value && same(h1.left, h2.left) && same(h1.right, h2.right);
    }

复杂度

最差的情况,数字都是1
如果这棵树特别不平衡,验证的行为就很少
越平衡,这个方法复杂度越差
用master公式: O(N"logN)

二、子树序列化优化

想把左树跟右树比对这个过程将复杂度O(N)-->0(1)
二叉树的先序序列化把一个结构信息变成一个字符串信息这个字符串信息就代表我结构本身
字符串做hash成一个固定长度的哈希值
空认为是#,变成一个hashcode:a12f3
发现节点2的左树,右树hashcode相等==>2是相等子树节点
2怎么加工自己的这棵树的hashcode?
a12f3_2_a12f3调用hashB数--> b25cb
用hashcode拼接后继续做hashcode,
这样左树右树的信息都是一个固定长度的字符串, hashcode虽然比较长,但是不会超过一个固定长度所以这样就把一个O(N)的比对行为变成了O(1)了

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int v) {
            value = v;
        }
    }
    public static int sameNumber2(Node head) {
        String algorithm = "SHA-256";
        Hash hash = new Hash(algorithm);
        return process(head, hash).ans;
    }

    public static class Info {
        public int ans;
        public String str;

        public Info(int a, String s) {
            ans = a;
            str = s;
        }
    }
    public static Info process(Node head, Hash hash) {
        if (head == null) {
            return new Info(0, hash.hashCode("#,"));
        }
        Info l = process(head.left, hash);
        Info r = process(head.right, hash);
        int ans = (l.str.equals(r.str) ? 1 : 0) + l.ans + r.ans;
        String str = hash.hashCode(String.valueOf(head.value) + "," + l.str + r.str);
        return new Info(ans, str);
    }

相关文章
|
12月前
|
存储 缓存 运维
缓存技术有哪些优缺点呢
【10月更文挑战第19天】缓存技术有哪些优缺点呢
|
算法 物联网 定位技术
iBeacon蓝牙定位赋能AR技术,重塑室内导航空间体验
iBeacon技术与AR结合,革新室内导航,解决传统技术在室内的局限。利用蓝牙BLE信号,iBeacon实现无需配对的精准定位,通过RSSI和算法计算用户位置。AR界面提供直观导航,适用于商场导购、博物馆导览、停车场寻车和景区导游等场景,实现高精度、实时、低能耗且互动的导航体验。未来,这一技术有望在智能生活领域发挥更大作用。
459 0
iBeacon蓝牙定位赋能AR技术,重塑室内导航空间体验
|
存储 安全 测试技术
【计算机三级数据库技术】第4章 数据库应用系统功能设计与实现--附思维导图
重点介绍了数据库应用系统(DBAS)的功能设计和实现。
252 1
|
机器学习/深度学习 搜索推荐 vr&ar
探索未来智能手机操作系统的发展趋势
随着科技的不断进步,智能手机操作系统正在经历着前所未有的变革和发展。本文将从技术创新、用户体验和生态系统三个方面探讨未来智能手机操作系统的发展趋势,展望智能手机操作系统的未来发展方向。
|
机器学习/深度学习 存储 自然语言处理
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)
407 0
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
|
Go 调度 云计算
为什么我们放弃了Erlang技术栈
结合小博无线技术团队的具体经验,深入讨论了Erlang技术栈在云计算环境中所遇到的问题。
12876 2
|
小程序 前端开发 数据安全/隐私保护
微信小程序开发笔记—设置页面密码
本文主要介绍了微信小程序实现设置页面密码的功能实现
508 0
|
存储 测试技术 异构计算
HDL-Bits 刷题记录 01
HDL-Bits 刷题记录 01
568 0
HDL-Bits 刷题记录 01
|
安全 JavaScript 前端开发
5个除了docker之外的轻量级容器
5个除了docker之外的轻量级容器
801 0