4.11 練手

考虑先从自己之后学的树等算法刷起, leetcode, 我不想看论文时的娱乐活动

Leetcode 100 Same Tree

递归前序遍历,但是不知道为什么每次submit的得到的时间不太一样,玄学地很,代码如下:

class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        #前序遍歷
        if p is None and q is None:
            return True
        elif p is None:
            return not q
        elif q is None:
            return not p
        while q and p:
            if q.val == p.val:
                return (self.isSameTree(q.left, p.left) and self.isSameTree(q.right,p.right))
            else:
                return False
        if q is None and p is None:
            return True
        else:
            return False

在 beat 70%+ 和 8%+ 两个数值飘忽不定,神奇

Discuss中的解法:
1. 同想法较为neat的代码:

def isSameTree(self, p, q):
    if p and q:
        return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
    return p is q



def isSameTree(self, p, q):
    return p and q and p.val == q.val and all(map(self.isSameTree, (p.left, p.right), (q.left, q.right))) or p is q

关于 map 的用法:

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

来源:

https://www.cnblogs.com/lincappu/p/8179475.html

 

2.使用 stack 以及 queue的前序遍历

stack 方法:两两成组怼进栈中匹配判断
 

class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        stack = [(p, q)]
        while stack:
            node1 , node2 = stack.pop()
            if not node1 and not node2:
                continue
            elif None in [node1, node2]:
                return False
            else:
                if node1.val != node2.val :
                    return False
                stack.append((node1.right, node2.right))
                stack.append((node1.left, node2.left))
        
        return True

queue方法:和stack的区别不大,其实就是前序判断先判断左节点还是右节点的区别,不会影响时间复杂度和输出。

 

 

94. Binary Tree Inorder Traversal 

中序遍歷練手,用stack來存(因爲要求不能用遞歸

代碼如下:

class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        result = []
        if root is None:
            return root
        stack = []
        stack.append(root)
        while root.left:
            stack.append(root.left)
            root = root.left
        while stack:
            curNode = stack.pop()
            result.append(curNode.val)
            if curNode.right:
                stack.append(curNode.right)
                root = curNode.right
                while(root.left):
                    stack.append(root.left)
                    root = root.left
        return result

beat 70%+ 难受(╯﹏╰)

 

Discuss中的思路:(存着,明天写。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值