初识数据结构与算法

本文介绍了数据结构的基本概念,包括集合、线性、树型和图的关系,以及顺序和链式存储。讨论了ArrayList和LinkedList的特点,以及在删除操作上的效率差异。阐述了栈和队列的应用,并通过递归算法举例八皇后问题。最后,讲解了二叉树的前序、中序和后序遍历,并提供了使用链表实现的二叉树中序排序代码示例。
摘要由CSDN通过智能技术生成

数据结构:

1.概念:

数据结构:数据之间的关系,提高程序效率。

逻辑关系:(人为认为)

(1)、集合:在一个范围内有多个数据,数据之间没有关系。

(2)、线性:1对1的关系

(3)、树型:1对多的关系

(4)、图:多对多的关系

物理关系:内存存储

1、顺序存储:数组(array)

2、链式存储:链表(node相连)

数据结构难不难:容易但是很难。

数据结构有没有用:有用且没有用,锻炼自己的思维能力。


ArrayList:

数组与集合的区别:动态大小。

ArrayList底层也是由array实现,动态大小的实现是如果放不下就新增一个更大的array来代替原数组实现的。

在ArrayList中删除数据的时候,先是删除该index中的数据,之后所有数据向前移动,后面每个数据的索引都会发生改变。

注意:在对ArrayList循环删除的时候,从后往前遍历效率高。

ArrayList删除数据:删除前面的数据效率低,删除后面的效率高。

LinkedList删除数据:删除前面和后面的数据效率高,越中间效率越低。

栈:数组和链表都可以实现,数组实现固定栈(栈的容量数量是固定的),链表可以实现动态栈。

队列:链表实现更加简单,效率更高。


递归算法:自己调用自己。典型的使用递归的地方:树的遍历。(不断寻找子节点的过程)文件夹(典型的树型结构)

重点:定义方法的参数。

代码实现八皇后:

package test;
public class test {

static int[][] map = new int[8][8];  //表示棋盘,0表示没有皇后,1表示有皇后
public static void main(String[] args){
play(0);
}
static int count = 1;

//显示棋盘
static void show(){
System.out.println("第"+count+"种摆法");
count++;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//验证此位置是否可以放皇后
static boolean check(int row,int col){
if(row==0){
return true;
}
else{

//验证上面
for(int i=row-1;i>=0;i++){
if(map[i][col]==1){
return false;
}
}
//验证左上方
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
if(map[i][j]==1){
return false;
}
}
//验证右上方
for(int i=row-1,j=col+1;i>=0&&j<8;i--,j++){
if(map[i][j]==1){
return false;
}
}
return true;
}


}
static void play(int row){
//遍历当前行的所有单元格
for(int i=0;i<8;i++){
if(check(row,i)){
map[row][i]=1;
}
if(row==7){
show();
//当最后一个皇后摆好后,去掉这个皇后,推翻原来的摆放,进入到下一种排列
}
else{
play(row+1);

//当调用自己结束后,说明这次摆放是不成立的,去掉这个皇后,推翻这次摆放

}
map[row][i]=0;//去掉皇后
}

}

}

二叉树

关于二叉树的遍历:

前序遍历:打左右。(对于每个节点来说,打印当前节点,再进行左边节点,再进行右边节点)

中序遍历:左打右。(对于每个节点来说,先打印左边节点,再打印父节点,再进行右边节点)

后序遍历:左右打。(对于每个节点来说,先打印左边节点,再进行右边节点,再进行父节点)

打:打印父节点的意思

(1)使用数组表示二叉树:堆排序

(2)使用链表表示二叉树:中序排序(1.必须为顺序二叉树,2.必须为中序遍历)

顺序二叉树:和父节点比较,小的为左子树,大的为右子树。

实现中序排序的代码:

1、Node.java

package doubleTree;
public class Node {
int value;
Node left;
Node right;
public Node(int value){
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}

}

2、DoubleTree.java

package doubleTree;


public class DoubleTree {

Node root;
public void add(int value){


Node node = new Node(value);
if(root==null){
root = node;
}
else{
Node temp = root;
while(true){
if(value<temp.getValue()) //小的放左边
{
if(temp.getLeft()==null){
temp.setLeft(node);
break;
}
else{
temp = temp.getLeft();
}
}
else{
if(temp.getRight()==null){
temp.setRight(node);
break;
}
else{
temp = temp.getRight();
}
}
}
}

}


public void show(){
showNode(root);
}

private void showNode(Node pNode){
//System.out.println(pNode.getValue());    前序遍历
if(pNode.getLeft()!=null){
showNode(pNode.getLeft());
}
System.out.println(pNode.getValue());   //中序遍历
if(pNode.getRight()!=null){
showNode(pNode.getRight());
}
//System.out.println(pNode.getValue());    后序遍历

}

}

3、test.java

package doubleTree;


public class test {

public static void main(String[] args){
DoubleTree dt = new DoubleTree();
dt.add(5);
dt.add(2);
dt.add(7);
dt.add(4);
dt.add(6);
dt.add(9);
dt.add(3);
dt.add(6);
dt.add(8);
dt.show();
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值