本文主要学习数据结构中的二叉树,包括常用的三种遍历方法:前序遍历、中序遍历和后序遍历。
二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。每个节点可以存储一个值或者其他相关信息。
Binary Search Tree),其中左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。还有平衡二叉树(Balanced Binary Tree),其中左子树和右子树的高度差不超过一。Pre-order),中序遍历(In-order),后序遍历(Post-order)。这些遍历方式可以帮助我们有效地处理二叉树中的节点。前序遍历(
Pre-order traversal)是一种二叉树遍历的方式,它按照根节点、左子树、右子树的顺序访问二叉树中的节点。
具体来说,前序遍历的步骤如下:
可以使用递归或迭代的方式实现前序遍历。
递归实现前序遍历的伪代码如下:
preorderTraversal(node):
if node is null:
return
访问当前节点(输出节点的值或进行其他操作)
preorderTraversal(node.left) # 递归前序遍历左子树
preorderTraversal(node.right) # 递归前序遍历右子树
迭代实现前序遍历通常使用栈(Stack)数据结构辅助完成。算法步骤如下:
LIFO)的数据结构,所以先入栈右子节点,再入栈左子节点,以确保左子节点在右子节点之前被访问。迭代实现前序遍历的伪代码如下:
preorderTraversal(node):
if node is null:
return
创建一个空栈
将根节点入栈
while 栈不为空:
弹出栈顶节点并访问该节点
如果节点的右子节点不为空,将右子节点入栈
如果节点的左子节点不为空,将左子节点入栈
无论是递归实现还是迭代实现,前序遍历会按照根节点、左子树、右子树的顺序遍历二叉树中的节点。这种遍历方式在某些问题的解决中非常有用,例如复制一棵二叉树、表达式求值等。
中序遍历(
In-order traversal)是一种二叉树遍历的方式,它按照左子树、根节点、右子树的顺序访问二叉树中的节点。
具体来说,中序遍历的步骤如下:
可以使用递归或迭代的方式实现中序遍历。
递归实现中序遍历的伪代码如下:
inorderTraversal(node):
if node is null:
return
inorderTraversal(node.left) # 递归中序遍历左子树
访问当前节点(输出节点的值或进行其他操作)
inorderTraversal(node.right) # 递归中序遍历右子树
迭代实现中序遍历通常使用栈(Stack)数据结构辅助完成。算法步骤如下:
迭代实现中序遍历的伪代码如下:
inorderTraversal(node):
创建一个空栈
初始化当前节点为根节点
while 栈不为空 或者 当前节点不为空:
将当前节点以及其所有左子节点依次入栈,直到当前节点为空
弹出栈顶节点并访问该节点
将当前节点指向弹出节点的右子节点
无论是递归实现还是迭代实现,中序遍历会按照左子树、根节点、右子树的顺序遍历二叉树中的节点。中序遍历常用于对二叉搜索树进行排序,也可以用于在二叉树中查找节点或执行其他与节点顺序相关的操作。
后序遍历(
Post-order traversal)是一种二叉树遍历的方式,它按照左子树、右子树、根节点的顺序访问二叉树中的节点。
具体来说,后序遍历的步骤如下:
可以使用递归或迭代的方式实现后序遍历。
递归实现后序遍历的伪代码如下:
postorderTraversal(node):
if node is null:
return
postorderTraversal(node.left) # 递归后序遍历左子树
postorderTraversal(node.right) # 递归后序遍历右子树
访问当前节点(输出节点的值或进行其他操作)
迭代实现后序遍历通常使用栈(Stack)数据结构辅助完成。算法步骤如下:
迭代实现后序遍历的伪代码如下:
postorderTraversal(node):
创建一个节点栈
创建一个结果栈
将根节点入节点栈
while 节点栈不为空:
弹出栈顶节点并将其压入结果栈
如果弹出节点的左子节点不为空,将左子节点入节点栈
如果弹出节点的右子节点不为空,将右子节点入节点栈
while 结果栈不为空:
弹出结果栈顶节点并访问该节点(输出节点的值或进行其他操作)
无论是递归实现还是迭代实现,后序遍历会按照左子树、右子树、根节点的顺序遍历二叉树中的节点。后序遍历常用于释放二叉树的内存资源、计算表达式的值等场景,也可以用于执行其他与节点顺序相关的操作。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
如下图二叉树为例,前序遍历的详细步骤:
0,遍历结果:0->1->21,2,遍历结果:1->3->4和2->5->6,与上一步合在一起,即3,4加在1的后边,5,6加在2的后边,遍历结果:0->1->3->4->2->5->63,4,遍历结果:3->7->8和4->9,与上一步合在一起,即7,8加在3的后边,9加在4的后边,遍历结果:0->1->3->7->8->4->9->2->5->6中序遍历的详细步骤:
0,遍历结果:1->0->21,2,遍历结果:3->1->4和5->2->6,与上一步合在一起,即3,4分别加在1的前边和后边,5,6也分别加在2的前边和后边,遍历结果:3->1->4->0->5->2->63,4,遍历结果:7->3->8和9->4,与上一步合在一起,即7,8分别加在3的前边和后边,9加在4的前边,遍历结果:7->3->8->1->9->4->0->5->2->6后序遍历的详细步骤:
0,遍历结果:1->2->01,2,遍历结果:3->4->1和5->6->2,与上一步合在一起,即3,4加在1的前边,5,6加在2的前边,遍历结果:3->4->1->5->6->2->03,4,遍历结果:7->8->3和9->4,与上一步合在一起,即7,8加在3的前边,9加在4的前边,遍历结果:7->8->3->9->4->1->5->6->2->0
⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔