admin 管理员组

文章数量: 1184232


2024年9月14日发(作者:transport中文什么意思)

二叉树的前序、中序和后序遍历是二叉树的基本遍历方式。前序遍历的顺序

是根-左-右,中序遍历的顺序是左-根-右,后序遍历的顺序是左-右-根。

以下是在 Java 中实现非递归版本的二叉树遍历:

前序遍历(根-左-右)

前序遍历可以直接使用栈实现。首先将根节点入栈,然后进入一个循环,每

次循环中,先弹出栈顶元素并访问,然后将其右子节点和左子节点依次入栈(注

意顺序)。

java

public void preOrderTraversal(TreeNode root) {

if (root == null) {

return;

}

Stack stack = new 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 stack1 = new Stack<>();

Stack stack2 = new 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 stack = new 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),因为在最坏的情况下,可能需要将所有节点都放入栈中。


本文标签: 节点 遍历 元素 访问 栈顶