一、二叉树
二叉树是一种树状数据结构,其中每个节点最多只能有两个子节点,通常称为左子节点和右子节点。二叉树的节点由指向左右子节点的指针以及存储数据的值组成
1.二叉树节点的类:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val #当前节点的值
self.left = left #指向左子节点的指针
self.right = right #指向右子节点的指针
2.简单构造这样的一棵树:
使用如下代码就能构造出上面那张图片中的二叉树
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val #当前节点的值
self.left = left #指向左子节点的指针
self.right = right #指向右子节点的指针
# 创建节点
node1 = TreeNode(3)
node2 = TreeNode(9)
node3 = TreeNode(20)
node4 = TreeNode(15)
node5 = TreeNode(7)
# 构建树的结构
node1.left = node2
node1.right = node3
node3.left = node4
node3.right = node5
3.给定一个数组递归地构造二叉树:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val #当前节点的值
self.left = left #指向左子节点的指针
self.right = right #指向右子节点的指针
# 给定数组构造一棵二叉树
def build_tree(nodes, index):
if index < len(nodes):
if nodes[index] is None:
return None
#首先传入数组第一个元素,即根节点
root = TreeNode(nodes[index])
#递归地构造左子树、右子树
root.left = build_tree(nodes, 2 * index + 1) #该节点对应左子节点的索引就是2 * index + 1,如果不知道为什么是这个,可以自己画一个二叉树的图标出索引,节点与子节点的索引是满足这个条件的
root.right = build_tree(nodes, 2 * index + 2) #该节点对应左子节点的索引就是2 * index + 2
return root
return None
# 举例给定数组
nodes_array = [1, 2, 3, 4, 5, 6, 7]
root_node = build_tree(nodes_array, 0)
这里递归的大致顺序如下(或者看图上的标号就是顺序),如果看着不是很能理解建议将上述代码复制到pycharm中打断点,一步一步地进行或者照着下面的步骤画一棵树,就能理解了:
传入根节点值(第零层)
构造根节点的左子节点(第一层):
传入左子结点的值
构造左子节点的左子节点(第二层)(如果数组里还有这个元素):
传入左子节点的左子节点的值:
构造左子节点的左子节点的左子节点(第三层):
...
构造左子节点的左子节点的右子节点(第三层):
...
构造左子节点的右子节点(第二层):
传入左子节点的右子节点的值:
构造左子节点的右子节点的左子节点(第三层):
...
构造左子节点的右子节点的柚子节点(第三层):
...
构造根节点的右子节点(第一层):
与左子树构造同理
完成构造