面试常考算法(五)——树相关算法

1.树的直径

distance = 0	# 记录树的深度

def dfs(root):
	if root is None:
    	return 0
    left = dfs(root.left)
    right = dfs(root.right)
    global distance
    distance = max(left+right, distance)
    return max(left,right) + 1
    
def diameter_of_binarytree(root):             
    dfs(root)
    return distance

2.树的最大深度

def max_depth(root):
	if root is None: 
	    return 0 
	else: 
	    left_height = max_depth(root.left) 
	    right_height = max_depth(root.right) 
	    return max(left_height, right_height) + 1

3. 判断树的路径和是否为某数

def has_path_sum(root, num):
    if root is None:
        return False
    num -= root.val
    if root.left is None and root.right is None:
        return num == 0
    return has_path_sum(root.left,num) or has_path_sum(root.right,num)

4.有序链表转二叉搜索树

def find_mid(head):
	"""找出中间的数"""
	prev = None
	slow = head
	fast = head
	while fast and fast.next:
	    prev = slow
	    slow = slow.next
	    fast = fast.next.next
	if prev:
	    prev.next = None
	return slow
        
def list2bst(head):
	"""主函数"""
    if not head:
        return None
    mid = find_mid(head)
    node = TreeNode(mid.val)
    
    if head == mid:
        return node
    
    node.left = list2bst(head)
    node.right = list2bst(mid.next)
    return node

5.有序数组转二叉搜索树

def array2bst(nums,start,end):
	if start == end:
	    return None
	mid = (start + end)//2
	node = TreeNode(nums[mid])
	node.left = array2bst(nums,start,mid)
	node.right = array2bst(nums,mid+1,end)
	return node
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值