开荒新系列之LeetCode: 004-Same Tree

本文介绍LeetCode第004题——比较两个二叉树是否完全一致。解题核心在于利用深度优先搜索(DFS)策略,探讨了DFS与广度优先搜索(BFS)在解决此问题时的效率差异,并展示了作者的DFS解法及其优化潜力。

开荒新系列之LeetCode: NO.004 Same Tree

在广图,连刷两道题好了。

题目大意

比较两个二叉树的异同,只有结构完全相同,且对应结点的值也相同的二叉树,才是完全一致的。

基本思路

啊,我的DFS和BFS,你们又要出现啦。
到底用哪种呢?

感觉更偏好于DFS一些。因为大部分二叉树在构造的时候都会偏向于平衡结构,因而BFS在抵达较深层次的时候,会使其任务队列过于庞大(最多需要2^h的大小,h为深度),对于平衡二叉树,DFS仅需要约2*h的大小的栈容量,当然如果是单边的二叉树,那为什么不用链表呢。

我的解法

写离线测试好麻烦,得想一想怎么构思一个离线测试集了

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def dfs(self, root):
        stack = [root]
        while stack != []:
            node_now = stack.pop()
            yield node_now
            # 采用右子树探寻
            if node_now.left != None:
                stack.append(node_now.left)
            if node_now.right!= None:
                stack.append(node_now.right)

    def xor(self, a, b):
        if a and b != None:
            return (a or b) and (not a and not b)
        if a == None and b == None:
            return False
        return True

    def check(self,a, b):
        if (a.val == b.val) and (self.xor(a.left, b.left) == False) and (self.xor(a.right, b.right) == False):
            return True
        return False

    def isSameTree(self, p, q):
        # 对空树处理
        if (p and q)== None:
            if (p or q) != None:
                return False
            return True

        gtr_p = self.dfs(p)
        gtr_q = self.dfs(q)
        result = True
        # 比较长度一致部分的结果
        try:
            while 1:
                node_now_p = gtr_p.next()
                node_now_q = gtr_q.next()
                if not self.check(node_now_p, node_now_q):
                    return False#,node_now_p.val, node_now_q.val, self.check(node_now_p, node_now_q)
        except: # stop Iteration....
            return True #,node_now_p.val, node_now_q.val, self.check(node_now_p, node_now_q)

中间有不少语法错误,忘记怎么用了。

另外这个代码的问题是速度比较慢。
我猜测整个判断结构应该可以优化一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值