返回
算法初探:栈的经典题与二叉树逆序遍历
前端
2024-02-03 09:04:52
迈入算法的殿堂,就如同踏上一段奇妙的智力之旅。算法,是计算机科学和数学的基础,也是编程的核心,掌握算法能够帮助我们高效地解决问题。而栈和二叉树则是算法中两个重要的数据结构,掌握它们,就如同打开了一扇通往算法世界的窗户。
栈的经典题:有效括号
栈,是一种遵循后进先出(Last In First Out,简称 LIFO)原则的线性表。它就像一个弹簧,后放进去的元素会最先弹出。栈在实际应用中非常广泛,比如计算器、网页浏览、编译器等。
有效括号,是一个经典的栈应用题。给定一个只包含括号的字符串,判断它是否有效。有效括号需要满足以下两个条件:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
例如,字符串 "()" 是有效的,因为左括号和右括号一一对应,且左括号先入栈,后出栈。而字符串 "([)]" 是无效的,因为右括号和左括号不对应。
使用栈来解决有效括号问题非常简单。我们只需要按照以下步骤操作:
- 将栈初始化为空。
- 遍历字符串中的每个字符。
- 如果遇到左括号,将其压入栈中。
- 如果遇到右括号,则从栈中弹出栈顶元素。
- 如果弹出栈顶元素与当前右括号不匹配,则字符串无效。
- 如果遍历完字符串后,栈为空,则字符串有效。
def is_valid_parentheses(string):
stack = []
for char in string:
if char in "([{":
stack.append(char)
elif char in ")]}":
if not stack:
return False
top = stack.pop()
if (top == "(" and char != ")") or (top == "[" and char != "]") or (top == "{" and char != "}"):
return False
return not stack
二叉树逆序遍历
二叉树,是一种由节点和边组成的树状结构。每个节点都有一个值和若干个子节点。二叉树的逆序遍历,是指以与先序遍历、中序遍历、后序遍历不同的顺序访问二叉树中的节点。
逆序遍历二叉树有很多种方法,其中最常见的一种是后序遍历。后序遍历的顺序是:先遍历左子树,再遍历右子树,最后访问根节点。
后序遍历二叉树的算法如下:
- 如果当前节点为空,则返回。
- 递归遍历左子树。
- 递归遍历右子树。
- 访问当前节点。
def postorder_traversal(root):
if root is None:
return
postorder_traversal(root.left)
postorder_traversal(root.right)
print(root.val)
总结
栈和二叉树是算法中非常重要的两个数据结构。栈遵循后进先出的原则,二叉树则是一种由节点和边组成的树状结构。掌握这些数据结构及其相关算法,能够帮助我们高效地解决问题。