使用栈可以有效地生成二叉树,本文将详细介绍使用先序遍历的方式实现这一过程。

算法步骤:

  1. 创建一个空栈,并将根节点压入栈中。
  2. 读取下一个节点,如果它是空节点,则弹出栈顶元素,重复该步骤直到读取到非空节点。
  3. 将该节点作为栈顶元素的左子节点,并将其压入栈中。
  4. 读取下一个节点,如果它是空节点,则弹出栈顶元素,重复该步骤直到读取到非空节点。
  5. 将该节点作为栈顶元素的右子节点,并将其压入栈中。
  6. 重复步骤2-5,直到所有节点都被处理完毕。
  7. 返回根节点。

示例:

给定先序遍历序列'[1,2,4,5,3,6,7]',可以按照上述步骤生成二叉树:

  1. 将1压入栈中。
  2. 读取2,将其作为1的左子节点,并将其压入栈中。
  3. 读取4,将其作为2的左子节点,并将其压入栈中。
  4. 读取5,将其作为4的右子节点,并将其压入栈中。
  5. 读取空节点,弹出栈顶元素5,重复该步骤直到读取到非空节点。
  6. 将空节点作为2的右子节点,并将其压入栈中。
  7. 读取空节点,弹出栈顶元素2,重复该步骤直到读取到非空节点。
  8. 将3作为1的右子节点,并将其压入栈中。
  9. 读取6,将其作为3的左子节点,并将其压入栈中。
  10. 读取7,将其作为6的右子节点,并将其压入栈中。
  11. 读取空节点,弹出栈顶元素7,重复该步骤直到读取到非空节点。
  12. 将空节点作为6的左子节点,并将其压入栈中。
  13. 读取空节点,弹出栈顶元素3,重复该步骤直到读取到非空节点。
  14. 完成。

最终生成的二叉树如下所示:

     1
   /   \
  2     3
 / \   / \
4   N 6   7
   / \
  N   N

代码实现:

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

def build_tree(preorder):
    if not preorder:
        return None
    root = Node(preorder[0])
    stack = [root]
    i = 1
    while i < len(preorder):
        node = Node(preorder[i])
        if stack[-1].left is None:
            stack[-1].left = node
        else:
            stack[-1].right = node
        stack.append(node)
        i += 1
        while stack and stack[-1].left is not None and stack[-1].right is not None:
            stack.pop()
    return root

本算法简单易懂,代码实现也较为简洁,是生成二叉树的有效方法。

使用栈生成二叉树:高效算法详解

原文地址: https://www.cveoy.top/t/topic/n7wz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录