1、二叉树的定义
2、二叉树的遍历
3、 代码实现二叉树
1、二叉树的定义
二叉树是一种树状结构,每个节点最多由两个子节点,分别成为左子节点和右子节点。具体来说,二叉树是由一组有限节点的组成的集合,这些节点通过链接(边)相互连接。其中由一个节点被指为根节点,除了根节点外,每个节点最多有一个父类点。若某节点没有子节点,那么它就是叶子节点。二叉树的特点是它的子树是有序的,即左子树和右子树是有区别的。二叉树常用于数据结构、算法和计算机科学等领域中。
2、二叉树的遍历
二叉树有4中遍历方式分别为前序遍历、中序遍历、后序遍历及层序遍历。
前序遍历:前序遍历即是从根节点开始,依次遍历左子树左子节点右子节点右子树左子节点右子节点。
定义二叉树
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
前序遍历可以用递归实现:
def preorder_traversal(root):
if root is None:
return
print(root.val, end=",")
preorder_traversal(root.left)
preorder_traversal(root.right)
中序遍历: 中序遍历可以看成将二叉树垂直向下投影,从左到右的顺序
中序遍历也可以使用递归实现:
def inorderTraversal(root):
res = []
if root:
res = inorderTraversal(root.left)
res.append(root.val)
res = res + inorderTraversal(root.right)
return
后序遍历:
先遍历左子树再右子树,不论对于左子树右子树还是根节点,都是先遍历左节点再遍历右节点。
def postorderTraversal(root: TreeNode) -> List[int]:
if root is None:
return []
left = postorderTraversal(root.left)
right = postorderTraversal(root.right)
return left + right + [root.val]
层序遍历:
从根节点开始,从左向右一层一层遍历。
可以使用队列来实现层序遍历
def levelOrderTraversal(root):
if not root:
return []
queue = [root]
result = []
while queue:
size = len(queue)
level = []
for i in range(size):
node = queue.pop(0)
level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(level)
return result
3、代码实现二叉树
我们先定义一个子节点,再定义一个根节点,然后对二叉树进行插入、打印操作。
class TreeNote:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class BinaryTree:
def __init__(self, root=None):
self.root = root
def insert(self, val):
new_code = TreeNote(val)
if not self.root:
self.root = new_code
else:
queue = [self.root]
while queue:
node = queue.pop(0)
if not node.left:
node.left = new_code
return
elif not node.right:
node.right = new_code
return
else:
queue.append(node.left)
queue.append(node.right)
def print_tree(self):
if not self.root:
return
queue = [self.root]
while queue:
node = queue.pop(0)
print(node.val, end=",")#特别关注
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
tree = BinaryTree(TreeNote(0))
for i in range(1,15):
tree.insert(i)
tree.print_tree()