欢迎访问宙启技术站
智能推送

使用collections.deque实现Python中的二叉树遍历算法

发布时间:2023-12-15 17:05:25

在Python中,要实现二叉树的遍历算法,可以使用collections.deque来辅助实现。collections.deque是一个双端队列,具有高效的插入和删除操作。下面我们将使用collections.deque来实现二叉树的前序、中序和后序遍历算法。

首先,我们定义一个二叉树节点类,包含节点的值和左右子节点的引用:

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

接下来,我们定义一个二叉树类,其中包含插入节点的方法和三种遍历算法的实现:

from collections import deque

class BinaryTree:
    def __init__(self):
        self.root = None
    
    def insert(self, value):
        if not self.root:
            self.root = Node(value)
        else:
            queue = deque([self.root])
            while queue:
                node = queue.popleft()
                if not node.left:
                    node.left = Node(value)
                    break
                elif not node.right:
                    node.right = Node(value)
                    break
                else:
                    queue.append(node.left)
                    queue.append(node.right)

    def preorder_traversal(self):
        if not self.root:
            return []
        result = []
        stack = deque([self.root])
        while stack:
            node = stack.pop()
            result.append(node.value)
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return result

    def inorder_traversal(self):
        if not self.root:
            return []
        result = []
        stack = deque()
        node = self.root
        while stack or node:
            if node:
                stack.append(node)
                node = node.left
            else:
                node = stack.pop()
                result.append(node.value)
                node = node.right
        return result

    def postorder_traversal(self):
        if not self.root:
            return []
        result = []
        stack1 = deque([self.root])
        stack2 = deque()
        while stack1:
            node = stack1.pop()
            stack2.append(node)
            if node.left:
                stack1.append(node.left)
            if node.right:
                stack1.append(node.right)
        while stack2:
            node = stack2.pop()
            result.append(node.value)
        return result

上述代码中,我们使用collections.deque来创建一个双端队列,用来辅助遍历操作。在插入节点时,我们使用BFS(广度优先搜索)算法,将节点按层级插入二叉树中。

在前序遍历算法中,我们使用栈结构来辅助遍历操作。首先将根节点入栈,然后出栈并访问节点,之后将节点的右子节点入栈,最后将节点的左子节点入栈。这样一来,栈中的元素顺序就是前序遍历的顺序。

在中序遍历算法中,我们使用栈结构来辅助遍历操作。从根节点开始,依次将左子节点入栈,直到遍历到最左边的节点为止。然后出栈并访问节点,并将节点的右子节点作为当前节点继续遍历。这样一来,栈中的元素顺序就是中序遍历的顺序。

在后序遍历算法中,我们使用两个栈结构来辅助遍历操作。首先使用 个栈stack1来依次将节点和其左右子节点入栈,直到将整个树遍历完。然后将stack1中的元素依次出栈,并放入第二个栈stack2中。最后,stack2中的元素顺序就是后序遍历的顺序。

下面是一个使用例子,我们创建一个二叉树对象并插入一些节点,然后分别进行前序、中序和后序遍历,并打印结果:

tree = BinaryTree()
tree.insert(1)
tree.insert(2)
tree.insert(3)
tree.insert(4)
tree.insert(5)
tree.insert(6)
tree.insert(7)

print("Preorder traversal: ", tree.preorder_traversal())
print("Inorder traversal: ", tree.inorder_traversal())
print("Postorder traversal: ", tree.postorder_traversal())

执行上述代码,输出结果如下:

Preorder traversal:  [1, 2, 4, 5, 3, 6, 7]
Inorder traversal:  [4, 2, 5, 1, 6, 3, 7]
Postorder traversal:  [4, 5, 2, 6, 7, 3, 1]

可以看到,我们使用collections.deque成功实现了二叉树的前序、中序和后序遍历算法。通过双端队列的插入和删除操作,我们可以高效地进行遍历操作,同时保持遍历顺序的正确性。