package org.lyk.main; import java.util.Scanner; enum NodeType { child, thread; } class Node<T extends Comparable<T>> { private static Node<String> pre = null; Node<T> left; NodeType leftType = NodeType.child; T data; Node<T> right; NodeType rightType = NodeType.child; @Override public String toString() { StringBuffer info = new StringBuffer(); info.append("leftType:" + this.leftType + " "); if (this.leftType.equals(NodeType.child)) { info.append("leftChild:" + this.left.data + " "); } else if(this.leftType.equals(NodeType.thread)) { info.append("pre data:" + this.left.data + " ") ; } info.append(" data: " + this.data + " "); info.append("rightType:" + rightType + " "); if(this.rightType.equals(NodeType.child)) { info.append(" rightChild:" + this.right.data + " "); } else if(this.rightType.equals(NodeType.thread)) { info.append("pre Child:" + this.right.data + " "); } return info.toString(); } void add(T data) { if (data.compareTo(this.data) < 0) { if (null != this.left) this.left.add(data); else { this.left = new Node<T>(); this.left.data = data; } } else { if (null != this.right) this.right.add(data); else { this.right = new Node<T>(); this.right.data = data; } } } public static <T extends Comparable<T>> Node<T> add_first(Node<T> node, Scanner scanner) { String data = input(scanner); if ("*".equals(data)) { node = null; } else { node = new Node<T>(); node.data = (T) data; node.left = Node.add_first(node.left, scanner); node.right = Node.add_first(node.right, scanner); } return node; } private static String input(Scanner scanner) { scanner.useDelimiter(" "); System.out.print("请输入:"); String data = (String) scanner.next(); return data; } void get_first() { System.out.print(this.data); if (null != this.left) { this.left.get_first(); } if (null != this.right) { this.right.get_first(); } } public void get_middle() { if (null != this.left) this.left.get_middle(); System.out.println(this); if (null != this.right) this.right.get_middle(); } public void getMiddleDetails() { if (null != this.left && this.leftType.equals(NodeType.child)) this.left.getMiddleDetails(); System.out.println(this); if (null != this.right && this.rightType.equals(NodeType.child)) this.right.getMiddleDetails(); } public void get_last() { if (null != this.left) this.left.get_last(); if (null != this.right) this.right.get_last(); System.out.print(this.data); } public void setThread(Node<T> pre) { if (null != this.left) { this.left.setThread(this); } if (null == this.left) { this.leftType = NodeType.thread; this.left = pre; } if (null == this.right) { this.rightType = NodeType.thread; this.right = pre; } if (null != this.right && this.rightType.equals(NodeType.child)) this.right.setThread(this); } } class Tree<T extends Comparable<T>> { Node<T> root; public void add_first(Scanner scanner) { this.root = Node.add_first(this.root, scanner); } public void get_first() { if (null != root) { root.get_first(); } } public void getMiddle() { if (null != this.root) this.root.get_middle(); } public void getMiddleDetails() { if (null != this.root) this.root.getMiddleDetails(); } public void get_last() { if (null != this.root) this.root.get_last(); } public void setThread() { if (null != this.root) { this.root.setThread(null); } } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Tree<String> bt = new Tree<>(); bt.add_first(scanner); System.out.println("add successed!!"); bt.setThread(); System.out.println("set successed!!!"); System.out.println("中序输出:"); bt.getMiddleDetails(); System.out.println("///~ main done"); } }