二叉の木がJavaを遍歴している。
6629 ワード
二叉の木の遍歴は三つの種類に分けられています。まず、中から順に遍歴し、後から順に遍歴します。つまり根の左右、左から右へ、左右の根です。この三つの遍歴の考え方は大体分かります。再帰的な方法を貼って二叉の木のコードを遍歴しています。
再帰的ではない形で二叉樹の遍歴を実現したいなら、参照してください。
// , ,
package order;
/**
* @date 2017 7 1 9:26:02
*/
public class BinaryTree {
protected Node root;
public BinaryTree(Node root) {
this.root = root;
}
public Node getRoot() {
return root;
}
/** */
public static Node init() {
Node a = new Node('A');
Node b = new Node('B', null, a);
Node c = new Node('C');
Node d = new Node('D', b, c);
Node e = new Node('E');
Node f = new Node('F', e, null);
Node g = new Node('G', null, f);
Node h = new Node('H', d, g);
return h;// root
}
/** */
public static void visit(Node p) {
System.out.print(p.getKey() + " ");
}
/** */
protected static void preorder(Node p) {
if (p != null) {
visit(p);
preorder(p.getLeft());
preorder(p.getRight());
}
}
/** */
protected static void inorder(Node p) {
if (p != null) {
inorder(p.getLeft());
visit(p);
inorder(p.getRight());
}
}
/** */
protected static void postorder(Node p) {
if (p != null) {
postorder(p.getLeft());
postorder(p.getRight());
visit(p);
}
}
public static void main(String[] args) {
BinaryTree tree = new BinaryTree(init());
System.out.print(" Pre-Order:");
preorder(tree.getRoot());
System.out.print("
In-Order:");
inorder(tree.getRoot());
System.out.print("
Post-Order:");
postorder(tree.getRoot());
}
}
class Node {
private char key;
private Node left, right;
public Node(char key) {
this(key, null, null);
}
public Node(char key, Node left, Node right) {
this.key = key;
this.left = left;
this.right = right;
}
public char getKey() {
return key;
}
public void setKey(char key) {
this.key = key;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
二叉樹のエルゴードについても、前のシーケンスから得られたのはルート(第一のノード)であるという点を指摘した。中間シーケンスで得られたのは、左右のサブツリーの分割です。後のシーケンスから得られたのはルート(最後のノード)です。前のシーケンスと後のシーケンスはルートのみを得ることができ、左右のサブツリーの分割が得られないので、唯一の二叉ツリーを決定することはできません。(前の順序+中の順序)または(後の順序+中の順序)は、一本の二叉樹を一意に確定することができます。再帰的ではない形で二叉樹の遍歴を実現したいなら、参照してください。