算法 Part4 Tree

算法 Part4 Tree

知识点

  1. 树。在这里插入图片描述树的种类:
    在这里插入图片描述

  2. 树的顺序存储,将数据结构存储在固定的数组中,虽然在遍历上有一定的优势,但所占空间较大,非主流二叉树。通常以链式储存。

  3. 树的常见应用场景。

    • xml, html,解析器。
    • 路由协议就是使用了树的算法
    • mysql数据库索引
    • 文件系统的目录结构
    • 很多经典的AI算法都是树搜索。
  4. 树的实现。

class Node:
	def __init__(self,item):
		self.val = item
		self.left = None
		self.right = None
	
class Tree:
	def __init__(self):
		self.root = None
	def add(self,item):
		node = Node(item)
		if not self.root: return
		queue = [self.root]
		while queue:
			cur_node = queue.pop(0)
			if not cur_node.left:
				cur_node.left = node
				return
			else:
				queue.append(cur_node.left)
			if not cur_node.right:
				cur_node.right = node
				return
			else:
				queue.append(cur_node.right)	
	def bfs(self):
		if not self.root: return []
		queue = [self.root]
		while queue:
			cur_node =queue.pop(0)
			print(cur_node.val)
			if cur_node.left:
				queue.append(cur_node.left)
			if cur_node.right:
				queue.append(cur_node.right)
  1. 前序(根左右)遍历。
#Method1 recursion
def preorder(root):
	if not root: return []
	return [root.val]+preorder(root.left)+preorder(root.right)
#Method2 iteration
def preorder(root):
	if not root: return []
	stack,res = [root],[]
	while stack:
		node = stack.pop()
		res.append(node.val)
		if node.right:
			stack.append(node.right)
		if node.left:
			stack.append(node.left)
	return res
  1. 中序(左根右)遍历。
#Method1 recursion
def inorder(root):
	if not root: return []
	return inorder(root.left)+[root.val]+inorder(root.right)
#Method2 iteration(medium)
def inorder(root):
	if not root: return []
	stack,res,node =[],[],root
	while stack or node:
		while node:
			stack.append(node)
			node = node.left
		node = stack.pop()			
		res.append(node.val)
		node = node.right
	return res
  1. 后序(左右根)遍历。
#Method1 recursion
def postorder(root):
	if not root: return []
	return postorder(root.left)+postorder(root.right)+[root.val]
#Method2 iteration(medium)
def postorder(root):
	if not root: return []
	stack,res,node =[],[],root
	while stack or node:
		while node:
			stack.append(node)
			node = node.left if node.left else node.right
		node = stack.pop()
		res.append(node.val)
		if stack and stack[-1].left == node:
			node = stack[-1].right
		else:
			node = None
	return res
  1. 两种排序(必须要知道中序)可以确定一棵树。遍历反推树较难。前序中序推后序,剑指OFFER07:
def buildtree(preorder,inorder):
	if not preorder or not inorder: return None
	root = Node(preorder[0])
	ind = inorder.index(preorder[0])
	root.left = buildtree(preorder[1:ind+1],inorder[:ind])
	root.right = buildtree(preorder[ind+1:],inorder[ind+1:]) 
	return root 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值