Java中的樹結(jié)構(gòu)是一種非常常見的數(shù)據(jù)結(jié)構(gòu)。在樹結(jié)構(gòu)中,遍歷是一個重要的算法。前序遍歷是其中一種經(jīng)常使用的遍歷方式。
public void preorderTraversal(Node node) { if (node == null) { return; } System.out.print(node.value + " "); preorderTraversal(node.left); preorderTraversal(node.right); }
上述代碼展示了使用遞歸方式進行前序遍歷的代碼。根據(jù)前序遍歷的定義,一個節(jié)點的值應(yīng)該在遍歷它的左右子節(jié)點之前輸出,因此代碼先輸出當(dāng)前節(jié)點的值,再依次遞歸遍歷左子節(jié)點和右子節(jié)點。
在遍歷樹結(jié)構(gòu)時,棧也是一種常用的數(shù)據(jù)結(jié)構(gòu)。可以通過棧實現(xiàn)非遞歸方式的前序遍歷。
public void nonRecursivePreorderTraversal(Node root) { if (root == null) { return; } Stackstack = new Stack<>(); stack.push(root); while (!stack.isEmpty()) { Node node = stack.pop(); System.out.print(node.value + " "); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } }
上述代碼使用了棧來實現(xiàn)前序遍歷。首先將根節(jié)點壓入棧中,然后進行循環(huán),每次彈出棧頂元素并輸出。接著將當(dāng)前節(jié)點的右子節(jié)點和左子節(jié)點分別壓入棧中。由于棧的先進后出特性,可以確保左子節(jié)點先于右子節(jié)點被訪問。