二叉树的深度

# -*-coding:utf-8-*-
__author__ = 'LL_YING'
# 二叉树的深度为根节点到最远子节点的距离
'''
可采用:广度优先搜索(BFS:Breadth First Search),又名宽度优先搜索和
深度优先搜索(DFSDepth First Search)两种:
广度优先搜索:属于一种盲目的搜索算法,目的是系统的展开并检查图中的所
有结果。换句话说,它并不会考虑结果可能的位置,彻底搜索整个图,直到找
到结果为止。
深度优先搜索:每次深度搜索的结果必然是图的一个连通分量。且可以从多节
点发起。PS:将每个节点在深度优先搜索中结束时间排序(具体方法是:创
建一个list,然后在每个节点的相邻节点都被访问的情况下,将节点加入到list
结尾,然后逆转整个链表。),这样就得到了所谓的拓扑排序。
'''

# Recursively(递归)DFS
# Definition for a binary tree node
class treeNode:
    def __init__(self, x):
        self.value = x
        self.left = None
        self.right = None
class Solution_1:
    def maxDepth(self, root):
        '''
        :param root:treeNode
        :return:integer
        '''
        if not root:
            return 0
        return 1+max(self.maxDepth(root.left), self.maxDepth(root.right))

# BFS+deque
class Solution_2:
    def maxDepth(self, root):
        if not root:
            return 0
        from collections import deque
        deque = deque([(root, 1)])
        while deque:
            curr, val = deque.popleft()
            if not curr.left and not curr.right and not deque:
                return val
            if curr.left:
                deque.append((curr.left, val+1))
            if curr.right:
                deque.append((curr.right, val+1))

# DFS with explicit stack
class Solution_3:
    def maxDepth(self, root):
        res = 0
        stack = [(root, 0)]
        while stack:
            node, level = stack.pop()
            if not node:
                res = max(res, level)
            else:
                stack.append(node.right, level+1)
                stack.append(node.left, level+1)
        return res
'''
from collections import deque
deque(双端队列)提供更全面的数列操作,可以从左右两边操作数列
Python的逻辑操作符:
1and  x and y
如果 x 为真,则 y 决定结果,返回 y ;如果 x 为假,x 决定了结果为假,返回 x即,x,y同时为真则为真,有一个为假则为假。
2or : x or y,and类似,x,y同时为假时结果为假,有一个为真则为真
3not :
返回表达式结果的相反的值。如果表达式结果为真,则返回false如果表达式结果为假,则返回true
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值