二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
一、构造树结构
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
a = TreeNode(1)
b = TreeNode(2)
c = TreeNode(3)
d = TreeNode(4)
e = TreeNode(5)
f = TreeNode(6)
g = TreeNode(7)
a.left = b
a.right = c
b.left = d
b.right = e
c.left = f
c.right = g
二、二叉树的遍历
(1)前序遍历
根节点->左子树->右子树
# 先序打印二叉树(递归)
def preOrderTraverse(node):
if not node:
return None
print(node.val)
preOrderTraverse(node.left)
preOrderTraverse(node.right)
# 先序打印二叉树(非递归)
def preOrderTravese(node):
stack = [node]
while len(stack) > 0:
print(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
node = stack.pop()
输出:1245367
(2)中序遍历
左子树->根节点->右子树
# 中序打印二叉树(递归)
def inOrderTraverse(node):
if not node:
return None
inOrderTraverse(node.leftChild)
print(node.val)
inOrderTraverse(node.rightChild)
# 中序打印二叉树(非递归)
def inOrderTraverse(node):
stack = []
pos = node
while pos or len(stack) > 0:
if pos:
stack.append(pos)
pos = pos.left
else:
pos = stack.pop()
print(pos.val)
pos = pos.right
输出:4251637
(3)后序遍历
左子树->右子树->根节点
# 后序打印二叉树(递归)
def postOrderTraverse(node):
if not node:
return None
postOrderTraverse(node.leftChild)
postOrderTraverse(node.rightChild)
print(node.root)
# 后序打印二叉树(非递归)
# 使用两个栈结构
# 第一个栈进栈顺序:左节点->右节点->跟节点
# 第一个栈弹出顺序: 跟节点->右节点->左节点(先序遍历栈弹出顺序:跟->左->右)
# 第二个栈存储为第一个栈的每个弹出依次进栈
# 最后第二个栈依次出栈
def postOrderTraverse(node):
stack = [node]
stack2 = []
while len(stack) > 0:
node = stack.pop()
stack2.append(node)
if node.left is not None:
stack.append(node.left)
if node.right is not None:
stack.append(node.right)
while len(stack2) > 0:
print(stack2.pop().val)
输出:4526731
(4)层序遍历
def layerTraverse(node):
if not node:
return None
queue = []
queue.append(node)
while len(queue) > 0:
tmp = queue.pop(0)
print(tmp.val)
if tmp.left:
queue.append(tmp.left)
if tmp.right:
queue.append(tmp.right)
输出:1234567
三、Binary Tree
BinaryTree是专门为学习二叉树而写的Python模块,它提供了生成、可视化输出二叉树的简单API。有这个库做基础,也方便测试自己写的算法。BinaryTree除了支持二叉树,还支持二叉堆(Heap)和二叉搜索树(BST)。
- BinaryTree源代码:https://github.com/joowani/binarytree

9万+

被折叠的 条评论
为什么被折叠?



