九度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 + " ") ;
		}
	}
}





【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值