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

题目链接 点击打开链接

题目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(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 + " ") ;
		}
	}
}





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值