53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
|
"""
|
|||
|
二叉树数组表示:根据层序遍历的特性,我们可以推导出父节点索引与子节点索引之间的“映射公式”:
|
|||
|
若某节点的索引为 i,则该节点的左子节点索引为 2i + 1,右子节点索引为 2i + 2。
|
|||
|
|
|||
|
完美二叉树是一个特例,在二叉树的中间层通常存在许多 None.
|
|||
|
了解决此问题,我们可以考虑在层序遍历序列中显式地写出所有 None。样处理后,层序遍历序列就可以唯一表示二叉树了。
|
|||
|
"""
|
|||
|
|
|||
|
|
|||
|
class ArrayBinaryTree:
|
|||
|
def __init__(self, arr: list[int | None]):
|
|||
|
self._tree = list(arr)
|
|||
|
|
|||
|
def size(self):
|
|||
|
return len(self._tree)
|
|||
|
|
|||
|
def val(self, i: int) -> int | None:
|
|||
|
"""获取索引为i的节点的值"""
|
|||
|
if i < 0 or i >= self.size():
|
|||
|
return None
|
|||
|
return self._tree[i]
|
|||
|
|
|||
|
def left(self, i: int) -> int | None:
|
|||
|
"""获取索引为 i 节点的左子节点的索引"""
|
|||
|
return 2 * i + 1
|
|||
|
|
|||
|
def right(self, i: int) -> int:
|
|||
|
return 2 * i + 2
|
|||
|
|
|||
|
def parent(self, i: int) -> int:
|
|||
|
return (i - 1) // 2
|
|||
|
|
|||
|
def level_order(self) -> int:
|
|||
|
for i in self._tree:
|
|||
|
if i:
|
|||
|
yield i
|
|||
|
|
|||
|
def dfs(self, i: int, order: str):
|
|||
|
"""深度优先遍历"""
|
|||
|
if self.val(i) is None:
|
|||
|
return
|
|||
|
# 前序遍历
|
|||
|
if order == "pre":
|
|||
|
self.res.append(self.val(i))
|
|||
|
self.dfs(self.left(i), order)
|
|||
|
# 中序遍历
|
|||
|
if order == "in":
|
|||
|
self.res.append(self.val(i))
|
|||
|
self.dfs(self.right(i), order)
|
|||
|
# 后序遍历
|
|||
|
if order == "post":
|
|||
|
self.res.append(self.val(i))
|