描述:
二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有的结点值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;(3)它的左右子树也分别为二叉排序树。现要求根据输入的元素值,构造一棵二叉排序树,并输出其先序遍历、中序遍历和后序遍历结果。
输入:
输入第一行为测试用例个数n,接下来为n个测试用例,每个测试用例占两行,其中第一行为元素个数m,第二行为m个需要构造成二叉排序树的元素值。
输出:
每个测试用例用三行输出,其中第一行输出先序遍历结果,第二行输出中序遍历结果,第三行输出后序遍历结果。各元素之间用一个空格隔开。
样例输入:
1
5
8 4 2 6 4
样例输出:
8 4 2 6 4
2 4 4 6 8
2 4 6 4 8
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int treenumber = sc.nextInt();
while (treenumber-- != 0) {
int nodenumber = sc.nextInt();
int[] data = new int[nodenumber];
for (int i = 0; i < nodenumber; i++)
data[i] = sc.nextInt();
Tree tree = new Tree(data[0]);
for (int i = 1; i < nodenumber; i++) {
Node search = new Node(data[i]);
tree.BuildTree(search, tree.getHead());
}
tree.xian(tree.getHead());
System.out.println();
tree.zhong(tree.getHead());
System.out.println();
tree.hou(tree.getHead());
System.out.println();
}
}
}
class Tree {
/// 类成员
private Node head;
/// 构造方法
public Tree(int item) {
head = new Node(item);
}
/// 函数集合
public void BuildTree(Node search, Node tree) {
if (search.data >= tree.data) {
if (tree.rchild == null) {
tree.rchild = search;
return;
}
BuildTree(search, tree.rchild);
} else {
if (tree.lchild == null) {
tree.lchild = search;
return;
}
BuildTree(search, tree.lchild);
}
}
public void hou(Node search) {
if (search == null)
return;
hou(search.lchild);
hou(search.rchild);
System.out.print(search.data + " ");
}
public void zhong(Node search) {
if (search == null)
return;
zhong(search.lchild);
System.out.print(search.data + " ");
zhong(search.rchild);
}
public void xian(Node search) {
if (search == null)
return;
System.out.print(search.data + " ");
xian(search.lchild);
xian(search.rchild);
}
/// Get和Set方法
public Node getHead() {
return head;
}
public void setHead(Node head) {
this.head = head;
}
}
class Node {
public Node lchild;
public Node rchild;
public int data;
public Node(int item) {
lchild = rchild = null;
data = item;
}
}