/**
* Desc:二叉樹的遍歷
* 前序遍歷:根節點,左子節點,右子節點.
* 中序遍歷:左子節點,根節點,右子節點
* 后序遍歷:左子節點,右子節點,根節點
*/
public class BinaryTree {
public static void main(String[] args) {
Node node = initNode();
ergodicNode(node, Order.ORDER_AFTER);
orderNode(node, Order.ORDER_AFTER);
}
/**
* 遞歸遍歷.
* @param node 二叉樹
* @param order 遍歷方式
*/
private static void ergodicNode(Node node, Order order) {
if (node != null) {
if (order == Order.ORDER_FRONT) {
System.out.print(node.getValue() + " ");
}
ergodicNode(node.getLeft(), order);
if (order == Order.ORDER_CENTER) {
System.out.print(node.getValue() + " ");
}
ergodicNode(node.getRight(), order);
if (order == Order.ORDER_AFTER) {
System.out.print(node.getValue() + " ");
}
}
}
/**
* 非遞歸遍歷.
* @param root 二叉樹
* @param order 遍歷方式
*/
private static void orderNode(Node root, Order order) {
Stack<Node> stack = new Stack<>();
switch (order) {
case ORDER_FRONT:
if (root != null) {
stack.push(root);
}
while (!stack.empty()) {
Node node = stack.pop();
System.out.print(node.getValue() + " ");
if (node.getRight() != null) {
stack.push(node.getRight());
}
if (node.getLeft() != null) {
stack.push(node.getLeft());
}
}
break;
case ORDER_CENTER:
while (root != null || !stack.empty()) {
while (root != null) {
stack.push(root);
root = root.getLeft();
}
if (!stack.empty()) {
Node node = stack.pop();
System.out.print(node.getValue() + " ");
root = node.getRight();
}
}
break;
case ORDER_AFTER:
Stack<Node> output = new Stack<>();
while (root != null || !stack.empty()) {
if (root != null) {
output.push(root);
stack.push(root);
root = root.getRight();
} else {
root = stack.pop();
root = root.getLeft();
}
}
while (!output.isEmpty()) {
System.out.print(output.pop().getValue() + " ");
}
break;
}
}
/**
* 63
* / \
* / \
* / \
* / \
* 27 80
* / \ / \
* / \ / \
* / \ 70 92
* 13 51 /
* \ / \ /
* \ / \ 82
* 26 33 58
* / \
* / \
* 57 60
* 前序遍歷:63 27 13 26 51 33 58 57 60 80 70 92 82
* 中序遍歷:13 26 27 33 51 57 58 60 63 70 80 82 92
* 后序遍歷:26 13 33 57 60 58 51 27 70 82 92 80 63
*
* @return Node
*/
private static Node initNode() {
return new Node(63)
.setLeft(new Node(27)
.setLeft(new Node(13)
.setRight(new Node(26)))
.setRight(new Node(51)
.setLeft(new Node(33))
.setRight(new Node(58)
.setLeft(new Node(57))
.setRight(new Node(60)))))
.setRight(new Node(80)
.setLeft(new Node(70))
.setRight(new Node(92)
.setLeft(new Node(82))));
}
enum Order {
ORDER_FRONT, ORDER_CENTER, ORDER_AFTER
}
private static class Node {
private int value;
private Node left;
private Node right;
private Node(int value) {
this.value = value;
}
private int getValue() {
return value;
}
private Node getLeft() {
return left;
}
private Node setLeft(Node left) {
this.left = left;
return this;
}
private Node getRight() {
return right;
}
private Node setRight(Node right) {
this.right = right;
return this;
}
}
}
Java實現二叉樹的三種遍歷方式
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...