admin 管理员组文章数量: 1184232
2024年9月14日发(作者:transport中文什么意思)
二叉树的前序、中序和后序遍历是二叉树的基本遍历方式。前序遍历的顺序
是根-左-右,中序遍历的顺序是左-根-右,后序遍历的顺序是左-右-根。
以下是在 Java 中实现非递归版本的二叉树遍历:
前序遍历(根-左-右)
前序遍历可以直接使用栈实现。首先将根节点入栈,然后进入一个循环,每
次循环中,先弹出栈顶元素并访问,然后将其右子节点和左子节点依次入栈(注
意顺序)。
java
public void preOrderTraversal(TreeNode root) {
if (root == null) {
return;
}
Stack
(root);
while (!y()) {
TreeNode node = ();
( + " ");
if ( != null) {
();
}
if ( != null) {
();
}
}
}
中序遍历(左-根-右)
中序遍历稍微复杂一些,因为我们需要保持正确的左右子节点的访问顺序。
这可以通过使用两个栈来实现。首先将根节点入栈1,然后进入循环。在每次循
环中,先判断栈1是否为空,如果不为空,则弹出栈顶元素并访问,然后将其右
子节点入栈1。如果栈1为空,则将栈2中的元素依次弹出并访问,然后将其左
子节点入栈1。
java
public void inOrderTraversal(TreeNode root) {
if (root == null) {
return;
}
Stack
Stack
(root);
while (!y()) {
TreeNode node = ();
(node);
if ( != null) {
();
}
}
while (!y()) {
TreeNode node = ();
( + " ");
if ( != null) {
();
}
}
}
后序遍历(左-右-根)
后序遍历是最复杂的,因为我们需要先访问左右子节点,再访问根节点。这
通常需要使用两个栈或者一个栈和一个临时节点来实现。这里我们使用一个栈和
一个临时节点的方法。首先将根节点和 null 入栈,然后进入循环。在每次循环
中,先判断栈顶元素是否有右子节点并且该右子节点未被访问过,如果有,则将
右子节点和 null 入栈。然后判断栈顶元素是否有左子节点并且该左子节点未被
访问过,如果有,则将左子节点和 null 入栈。最后,弹出栈顶的两个元素(一
个节点和一个 null),访问该节点。
java
public void postOrderTraversal(TreeNode root) {
if (root == null) {
return;
}
Stack
(root);
(null);
TreeNode prev = null;
while (!y()) {
TreeNode node = ();
if (node != null) {
if ( != null) {
();
}
if ( != null) {
();
}
(node);
} else {
node = ();
if (prev != null && prev == || prev == ) {
prev = node;
continue;
}
( + " ");
prev = node;
}
}
}
这些遍历方法的时间复杂度都是 O(n),其中 n 是二叉树中节点的数量。空
间复杂度也是 O(n),因为在最坏的情况下,可能需要将所有节点都放入栈中。
版权声明:本文标题:二叉树遍历前序中序后序 java 非递归 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1726266503a935813.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论