堆,属于完全二叉树,一般用列表存储。但对于不完全二叉树,用列表存储会有大量空位产生,因此采用链式存储。
二叉树的链式存储:将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方式来连接。
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
考察方式:
【1】给你一棵树,写出前序、中序、后序的序列。递归法和迭代法。
【2】给出前序、中序、后序的序列其中之二,让你画出一棵树(一般给出中序,再给出一个前序或者后序。很少给前序和后序,因为极容易出现不唯一的情况)
总的规律:
· 前序:根在小团体第一位
· 后序:根在小团体的最后一位
· 中序:根分开了左右子树
二叉树的遍历
图中二叉树的遍历:
· 前序遍历:EACBDGF
· 中序遍历:ABCDEGF
· 后序遍历:BDCAFGE
· 层次遍历:EAGCFBD
二叉树的前三种遍历是深度优先DFS,可以用递归(实质是 栈)来实现。而最后一种层次遍历是广度优先BFS。
递归
前序遍历:打印-左-右
中序遍历:左-打印-右
后序遍历:左-右-打印
中序遍历
以中序遍历为例,
终止条件: 当前节点为空时
子问题: 递归的调用左节点,打印当前节点,再递归调用右节点
Version 1
# 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 inorderTraversal(self, root):
res=[]
self.helper(root, res) ### 带self
return res
def helper(self, root, res): ### def helper(self,...) 带self
if root