使用栈生成二叉树:高效算法详解
使用栈可以有效地生成二叉树,本文将详细介绍使用先序遍历的方式实现这一过程。
算法步骤:
- 创建一个空栈,并将根节点压入栈中。
- 读取下一个节点,如果它是空节点,则弹出栈顶元素,重复该步骤直到读取到非空节点。
- 将该节点作为栈顶元素的左子节点,并将其压入栈中。
- 读取下一个节点,如果它是空节点,则弹出栈顶元素,重复该步骤直到读取到非空节点。
- 将该节点作为栈顶元素的右子节点,并将其压入栈中。
- 重复步骤2-5,直到所有节点都被处理完毕。
- 返回根节点。
示例:
给定先序遍历序列'[1,2,4,5,3,6,7]',可以按照上述步骤生成二叉树:
- 将1压入栈中。
- 读取2,将其作为1的左子节点,并将其压入栈中。
- 读取4,将其作为2的左子节点,并将其压入栈中。
- 读取5,将其作为4的右子节点,并将其压入栈中。
- 读取空节点,弹出栈顶元素5,重复该步骤直到读取到非空节点。
- 将空节点作为2的右子节点,并将其压入栈中。
- 读取空节点,弹出栈顶元素2,重复该步骤直到读取到非空节点。
- 将3作为1的右子节点,并将其压入栈中。
- 读取6,将其作为3的左子节点,并将其压入栈中。
- 读取7,将其作为6的右子节点,并将其压入栈中。
- 读取空节点,弹出栈顶元素7,重复该步骤直到读取到非空节点。
- 将空节点作为6的左子节点,并将其压入栈中。
- 读取空节点,弹出栈顶元素3,重复该步骤直到读取到非空节点。
- 完成。
最终生成的二叉树如下所示:
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 著作权归作者所有。请勿转载和采集!