二叉排序树的创建与使用
描述:
二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树:(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; } }