二叉树
1、二叉树是一颗只有两个结点的数。如下图所示:
2、特点:
1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
2)左子树和右子树是有顺序的,次序不能任意颠倒。
3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。
3、性质
1)在二叉树的第i层上最多有2i-1 个节点 。(i>=1)
2)二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)
3)n0=n2+1 n0表示度数为0的节点数,n2表示度数为2的节点数。
4)在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]是向下取整。
5)若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有如下特性:
- (1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
- (2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
- (3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。
4、二叉树搜索
前序遍历,根->左子树->右子树
中序遍历,左子树->根->右子树
后序遍历,左子树->右子树->根
所谓前序中序后序,都是指的根节点
LeetCode题目
98. 验证二叉搜索树
思路:
根据搜索二叉树的特点,采用递归的思想,只要每个树的左右子树均满足搜索二叉树即可。
代码:
(今天代码复制总出错,抱歉只能贴图)
102. 二叉树的层次遍历
先进先出
代码:
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if root is None:
return []
stack = [root]
list_sum = []
while stack: # 设置none出
list = [] #出栈
for i in range(len(stack)): #每一层
cur = stack.pop(0)
list.append(cur.val)
if cur.left:
stack.append(cur.left) #入栈
if cur.right:
stack.append(cur.right)
list_sum.append(list)
return list_sum
LeetCode107. 二叉树的层次遍历 II
思路:与102题相同,只是最后返回的列表res逆序。
代码:
class Solution(object):
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
queue = [root]
res = []
while queue:
templist = []
length = len(queue)
for i in range(length):
temp = queue.pop(0)
templist.append(temp.val)
if temp.left:
queue.append(temp.left)
if temp.right:
queue.append(temp.right)
res.append(templist)
return res[::-1]