二叉树
二叉树的实现
二叉树的每个节点上,至多包含两个子节点(left&right)。除根节点(root)外,每个节点有且只有一个父节点(parent)
二叉树的实质是非线性的链表
简单的二叉树
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
二叉树的遍历
一般使用递归实现深度搜索的办法遍历二叉树。
二叉树的遍历方法分为三种:
- 先序:遍历顺序:根节点->左节点->右节点
- 中序:遍历顺序:左节点->根节点->右节点
- 后序:遍历顺序:左节点->右节点->根节点
例如:
A
/ \
B C
/ \ / \
D E F G
\ \ / \
H I J K
- 先序遍历结果: A B D H E I C F J K G
- 中序遍历结果: D H B E I A J F K C G
- 后序遍历结果: H D I E B J K F G C A
特征:
- 前序遍历,第一个节点为根节点
- 后序遍历,最后一个节点为根节点
- 中序遍历,根节点两边为子树
- 获得中序遍历与任一其他遍历即可还原二叉树
LeetCode 100
给定两个编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例
输入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
解题方法
def traversal(self, p, q):
if not p and not q:
return True
elif not p or not q:
return False
else:
if p.val != q.val: return False
else: return self.traversal(p.left,q.left) and self.traversal(p.right, q.right)
本题采用先序遍历的方法,逐节点比较。遇到None,即触到树底则返回布尔值并与下一段进行比较。
LeetCode 104 二叉树最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。1
代码实现
深度搜索,遍历每个叶节点,获取深度
class Solution(object):
def traverse(self,tree, length):
if not(tree.left or tree.right):
if length > self.result:
self.result = length
elif not tree.left:
self.traverse(tree.right, length+1)
elif not tree.right:
self.traverse(tree.left, length+1)
else:
self.traverse(tree.left, length+1)
self.traverse(tree.right, length+1)
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.result = 0
if root:
self.traverse(root, 1)
return self.result
else:
return 0