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

来源:互联网 发布:网站运营数据分析 编辑:程序博客网 时间:2024/06/07 00:35

题目链接 点击打开链接

题目1201:二叉排序树

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4934

解决:2074

题目描述:

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

输入:

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

输出:

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

样例输入:
51 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(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 + " ") ;}}}





0 0
原创粉丝点击