九度oj 1201 二叉排序树的创建+遍历
2015-12-15 22:10
411 查看
题目链接 点击打开链接
题目1201:二叉排序树
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:4934
解决:2074
题目描述:
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
输入第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。
输出:
可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
每种遍历结果输出一行。每行最后一个数据之后有一个空格。
样例输入:
样例输出:
提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。
分析:
二叉排序树的定义:
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
创建二叉排序树,有返回结点的代码如下:
创建二叉排序树,无返回结点的代码如下:
题目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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树