您的位置:首页 > 编程语言 > Java开发

九度oj 1201 二叉排序树的创建+遍历

2015-12-15 22:10 411 查看
题目链接 点击打开链接

题目1201:二叉排序树

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:4934

解决:2074

题目描述:

    输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。

输入:

    输入第一行包括一个整数n(1<=n<=100)。

    接下来的一行包括n个整数。

输出:

    可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。

    每种遍历结果输出一行。每行最后一个数据之后有一个空格。

样例输入:
5
1 6 5 9 8


样例输出:
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1


提示:

输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

分析:

二叉排序树的定义:

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。
创建二叉排序树,有返回结点的代码如下:

import java.io.*;
import java.util.*;
public class Main{   // 注意提交时必须是Main类,否则编译错误
public static void main(String []args){
Scanner cin = new Scanner(new InputStreamReader(System.in)) ;
PrintWriter cout = new PrintWriter(System.out) ;
while(cin.hasNext()){
new Task1(cin.nextInt()).solve(cin, cout);
}
cout.flush();
cout.close();
}
}

class Node{
int val ;
Node left , right ;
Node(int val){
this.val = val ;
left = right = null ;
}
Node(){
left = right = null ;
}
}

class Task1{

PrintWriter cout ;
int n ;
public Task1(int n){
this.n = n ;
}

void solve(Scanner cin , PrintWriter cout){
this.cout = cout ;
Node root = null ;
for(int i = 1 ; i<= n ;i++){
root = insert(root , cin.nextInt()) ;
}
preOrder(root) ;
cout.println();
inOrder(root) ;
cout.println();
postOrder(root) ;
cout.println();
cout.flush();
}
//每一次插入都相当于重新建一棵树,在以p节点为根的二叉树中插入节点,返回新树的新根节点
Node insert(Node p ,  int key){  //有返回子根节点的插入方法
if( p== null){
p = new Node(key) ;
return p;
}
if(key < p.val)  p.left = insert(p.left , key) ;
else if(key > p.val)  p.right = insert(p.right , key) ;
return p ;
}

// 前序递归遍历
void preOrder(Node p){
if(p != null){
cout.print(p.val + " ") ;
preOrder(p.left) ;
preOrder(p.right) ;
}
}
//中序递归遍历二叉树
void inOrder(Node p){
if(p!= null){
inOrder(p.left) ;
cout.print(p.val + " ") ;
inOrder(p.right) ;
}
}

//后序递归遍历
void postOrder(Node p){
if(p != null){
postOrder(p.left) ;
postOrder(p.right) ;
cout.print(p.val + " ") ;
}
}
}


创建二叉排序树,无返回结点的代码如下:

import java.io.*;
import java.util.*;
public class Main{
public static void main(String []args){
Scanner cin = new Scanner(
4000
new InputStreamReader(System.in)) ;
PrintWriter cout = new PrintWriter(System.out) ;
while(cin.hasNext()){
new Task1(cin.nextInt()).solve(cin, cout);
}
cout.flush();
cout.close();
}
}

class Node{
int val ;
Node left , right ;
Node(int val){
this.val = val ;
left = right = null ;
}
Node(){
left = right = null ;
}
}

class Task1{

PrintWriter cout ;
int n ;
public Task1(int n){
this.n = n ;
}

void solve(Scanner cin , PrintWriter cout){
this.cout = cout ;
Node root = new Node(-100) ;
for(int i = 1 ; i<= n ;i++){
insert(root , cin.nextInt()) ;
}
preOrder(root) ;
cout.println();
inOrder(root) ;
cout.println();
postOrder(root) ;
cout.println();
cout.flush();
}
//在以p节点为根的二叉树中插入节点后,新的二叉树的根节点还是p,每次插入的节点都是叶子节点
void insert( Node p , int key){
if( p.val == -100){
//p = new Node(key) ; // 这里有java 与c++ 不同的地方,
//核心卷I P123页,一个方法不能让 对象参数 引用一个新的对象,(引用后并不改变实参root,不能达到所想要的目的)
p.val = key ;
return ;
}
if(key < p.val) {
if (p.left == null){
p.left = new Node(key) ;
}

else{
insert(p.left , key) ;
}
}
else if(key > p.val)  {
if(p.right == null){
p.right = new Node(key) ;
}
else
insert(p.right , key) ;

}
}

// 前序递归遍历
void preOrder(Node p){
if(p != null){
cout.print(p.val + " ") ;
preOrder(p.left) ;
preOrder(p.right) ;
}
}
//中序递归遍历二叉树
void inOrder(Node p){
if(p!= null){
inOrder(p.left) ;
cout.print(p.val + " ") ;
inOrder(p.right) ;
}
}

//后序递归遍历
void postOrder(Node p){
if(p != null){
postOrder(p.left) ;
postOrder(p.right) ;
cout.print(p.val + " ") ;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉排序树 java