二叉搜索树中插入与删除操作详解_第1页
二叉搜索树中插入与删除操作详解_第2页
二叉搜索树中插入与删除操作详解_第3页
二叉搜索树中插入与删除操作详解_第4页
二叉搜索树中插入与删除操作详解_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

二叉搜索树中插入与删除操作详解一、概述

二叉搜索树(BinarySearchTree,BST)是一种基于键值有序存储的树形数据结构,其中每个节点的左子树仅包含键值小于该节点的节点,右子树仅包含键值大于该节点的节点。二叉搜索树的插入和删除操作是维护其有序性的关键,以下将详细说明这两种操作的具体步骤和实现方法。

二、二叉搜索树的插入操作

(一)插入步骤

1.创建新节点:生成一个包含键值的新节点,并初始化其左右子节点为空。

2.空树插入:如果二叉搜索树为空,则新节点成为根节点。

3.非空树插入:

(1)从根节点开始,比较新节点的键值与当前节点的键值。

(2)如果新节点的键值小于当前节点的键值,则移动到左子节点;否则移动到右子节点。

(3)重复步骤(2),直到找到空子节点位置,将新节点插入该位置。

(二)示例

假设插入键值序列[8,3,10,1,6,14,4,7,13]到空二叉搜索树中:

1.插入8,树为空,8成为根节点。

2.插入3,小于8,插入为左子节点。

3.插入10,大于8,插入为右子节点。

4.插入1,小于8且小于3,插入为3的左子节点。

5.插入6,大于3且小于8,插入为3的右子节点。

6.插入14,大于8且大于10,插入为10的右子节点。

7.插入4,大于3且小于6,插入为6的左子节点。

8.插入7,大于6且小于8,插入为6的右子节点。

9.插入13,大于10且小于14,插入为14的左子节点。

三、二叉搜索树的删除操作

(一)删除步骤

1.查找目标节点:通过遍历二叉搜索树定位待删除节点。

2.删除节点分类:

(1)叶节点:直接删除节点,父节点的对应子节点指针置为空。

(2)单子节点:删除节点后,用其子节点替代该节点位置。

(3)双子节点:

a.找到待删除节点的中序后继(右子树的最小节点)或中序前驱(左子树的最大节点)。

b.将后继/前驱的键值替换到待删除节点。

c.删除后继/前驱节点(此时变为单子节点或叶节点,可按前述规则处理)。

(二)示例

假设删除键值序列[8,3,10,1,6,14,4,7,13]中的7:

1.查找节点7,发现其左右子节点均存在。

2.找到节点7的右子树最小节点13(中序后继)。

3.将13的键值替换到节点7,节点7变为13。

4.删除原节点13,其为叶节点,直接删除。

(三)边界情况处理

1.根节点删除:删除根节点后,选择新的根节点(如中序后继)替代。

2.空树删除:无操作。

3.未找到节点:返回删除失败提示。

四、插入与删除的效率分析

(一)插入操作

-时间复杂度:平均O(logn),最坏O(n)(树退化成链表)。

-空间复杂度:O(n),用于存储树节点。

(二)删除操作

-时间复杂度:平均O(logn),最坏O(n)。

-空间复杂度:O(logn),递归栈或迭代过程中的临时变量。

五、总结

二叉搜索树的插入和删除操作通过维护节点间的键值有序性,保证了树的搜索效率。正确处理不同类型的节点(叶节点、单子节点、双子节点)是确保树结构完整性的关键。在实际应用中,可通过平衡二叉搜索树(如AVL树、红黑树)进一步优化性能。

一、概述

二叉搜索树(BinarySearchTree,BST)是一种基于键值有序存储的树形数据结构,其中每个节点的左子树仅包含键值小于该节点的节点,右子树仅包含键值大于该节点的节点。二叉搜索树的插入和删除操作是维护其有序性的关键,以下将详细说明这两种操作的具体步骤和实现方法。二叉搜索树的性质是其所有操作的基础,必须首先明确:

(一)二叉搜索树的性质

1.对于任何节点N,N的左子树中所有节点的键值均小于N的键值。

2.对于任何节点N,N的右子树中所有节点的键值均大于N的键值。

3.左子树和右子树本身也必须是一棵二叉搜索树。

4.没有重复的键值节点(根据具体实现,通常允许或禁止重复)。

二、二叉搜索树的插入操作

(一)插入步骤

1.创建新节点:生成一个包含键值的新节点,并初始化其左右子节点指针为`null`(或空指针)。节点通常还包含其他字段,如数据值、左右子节点引用等。

示例代码片段(伪代码):

```

NodenewNode=newNode(keyValue);

newNode.left=null;

newNode.right=null;

```

2.空树插入:如果二叉搜索树当前为空(根节点为`null`),则新节点成为根节点。

操作步骤:

(1)检查根节点是否为`null`。

(2)如果为`null`,将新节点赋值给根节点。

```

if(root==null){

root=newNode;

}

```

3.非空树插入:如果二叉搜索树不为空,则按照键值大小关系逐层查找插入位置。

(1)初始化当前节点为根节点。

(2)比较新节点的键值与当前节点的键值。

(3)如果新节点的键值小于当前节点的键值:

-如果当前节点的左子节点为`null`,则将新节点插入为当前节点的左子节点。

-如果当前节点的左子节点不为`null`,则将当前节点更新为其左子节点,并返回步骤(2)。

(4)如果新节点的键值大于或等于当前节点的键值(根据是否允许重复键值处理):

-如果允许重复,且键值等于当前节点,可以选择插入到左或右(例如,统一插入左子树)。

-如果不允许重复,且键值等于当前节点,则不插入并返回。

-如果当前节点的右子节点为`null`,则将新节点插入为当前节点的右子节点。

-如果当前节点的右子节点不为`null`,则将当前节点更新为其右子节点,并返回步骤(2)。

```

Nodecurrent=root;

Nodeparent=null;//用于记录父节点

while(current!=null){

parent=current;

if(newNode.keyValue<current.keyValue){

current=current.left;

}elseif(newNode.keyValue>current.keyValue){//或者处理等于的情况

current=current.right;

}else{

//键值已存在,根据需求处理(例如插入左子树)

current=current.left;

}

}

//current==null时,parent是插入位置

if(newNode.keyValue<parent.keyValue){

parent.left=newNode;

}else{

parent.right=newNode;

}

```

(二)示例

假设插入键值序列[8,3,10,1,6,14,4,7,13]到空二叉搜索树中,并展示每一步的树结构变化:

1.插入8:树为空,8成为根节点。

```

8

```

2.插入3,小于8,插入为8的左子节点。

```

8

/

3

```

3.插入10,大于8,插入为8的右子节点。

```

8

/\

310

```

4.插入1,小于8且小于3,插入为3的左子节点。

```

8

/\

310

/

1

```

5.插入6,大于3且小于8,插入为3的右子节点。

```

8

/\

310

/\

16

```

6.插入14,大于8且大于10,插入为10的右子节点。

```

8

/\

310

/\

16

\

14

```

7.插入4,大于3且小于6,插入为6的左子节点。

```

8

/\

310

/\

16

//

414

```

8.插入7,大于6且小于8,插入为6的右子节点。

```

8

/\

310

/\

16

//\

4714

```

9.插入13,大于10且小于14,插入为14的左子节点。

```

8

/\

310

/\

16

//\

4714

\/

13

```

三、二叉搜索树的删除操作

(一)删除步骤

删除操作相对复杂,需要根据待删除节点的子节点情况分情况处理。主要步骤如下:

1.查找目标节点:通过遍历二叉搜索树定位待删除节点(记为`targetNode`)。

-使用递归或迭代方式,比较键值并沿左或右子树查找。

-同时记录`targetNode`的父节点(记为`parentNode`)。

2.确定节点类型并执行删除:根据`targetNode`的子节点数量进行分类处理。

(1)删除叶节点(无子节点):

a.检查`targetNode`是否为左子节点(`parentNode.left==targetNode`)。

b.如果是,将`parentNode.left`指针置为`null`。

c.如果不是,将`parentNode.right`指针置为`null`。

d.删除`targetNode`占用的内存空间(在编程语言中)。

(2)删除单子节点(一个子节点):

a.检查`targetNode`有一个左子节点或右子节点。

b.假设`targetNode`有左子节点(右子节点逻辑相同):

-将`targetNode`的左子节点提升到`targetNode`的位置。

-更新`parentNode`的对应指针(左或右)指向`targetNode`的左子节点。

c.假设`targetNode`有右子节点:

-将`targetNode`的右子节点提升到`targetNode`的位置。

-更新`parentNode`的对应指针指向`targetNode`的右子节点。

d.删除`targetNode`占用的内存空间。

(3)删除双子节点(左右子节点均存在):

a.寻找中序后继:

-中序后继是`targetNode`右子树中的最小节点(即最左侧节点)。

-从`targetNode.right`开始,不断向左移动,直到到达最左侧节点(`inorderSuccessor`)。

-记录`inorderSuccessor`的父节点(`inorderSuccessorParent`)。

b.寻找中序前驱(作为替代方案):

-中序前驱是`targetNode`左子树中的最大节点(即最右侧节点)。

-从`targetNode.left`开始,不断向右移动,直到到达最右侧节点(`inorderPredecessor`)。

-记录`inorderPredecessor`的父节点(`inorderPredecessorParent`)。

c.替换键值:

-选择中序后继或中序前驱(通常选择后继,因为前驱可能需要同时处理其右子树)。

-将`inorderSuccessor.keyValue`的值复制到`targetNode.keyValue`。

d.删除原后继节点:

-`inorderSuccessor`节点现在成为叶节点或单子节点(因为它取代了`targetNode`的位置,其原来的子节点现在直接挂在`inorderSuccessor`下)。

-根据其子节点情况执行删除叶节点或单子节点的操作(步骤(1)或(2))。

3.更新根节点(如果需要):如果删除的是根节点,则根节点指针需要指向新的树根(通常由步骤(2)c中的替换操作间接完成)。

4.返回结果:返回删除成功或未找到节点的指示。

(二)示例

假设删除键值序列[8,3,10,1,6,14,4,7,13]中的7:

1.查找节点7:

-从根节点8开始,7小于8,移动到3。

-7大于3,移动到6。

-7大于6,移动到7节点,找到目标节点。

-记录父节点为6。

2.确定节点类型:节点7是叶节点(无子节点)。

3.执行删除:

-检查`parentNode`(6)的右子节点是否为`targetNode`(7)。是。

-将`parentNode.right`指针置为`null`(即`6.right=null`)。

-删除节点7占用的内存空间。

4.结果树结构(对比删除前):

```

8

/\

310

/\

16

//\

4714

\/

13

```

删除节点7后:

```

8

/\

310

/\

16

//

414

/

13

```

(三)示例(双子节点删除)

假设删除键值序列[8,3,10,1,6,14,4,7,13]中的8(根节点):

1.查找节点8:

-根节点就是8,`parentNode`为`null`。

2.确定节点类型:节点8是双子节点(左子节点3和右子节点10)。

3.寻找中序后继:

-从`targetNode.right`(节点10)开始,向左移动到节点13。

-`inorderSuccessor`是13,`inorderSuccessorParent`是10。

4.替换键值:

-将13的键值复制到8:`8.keyValue=13`。

5.删除原后继节点13:

-节点13现在是叶节点(原右子节点14直接挂在13下,但13作为右子节点被删除)。

-将`inorderSuccessorParent.right`指针置为`null`(即`10.right=null`)。

6.更新根节点:新的根节点是8(现在包含键值13)。

7.结果树结构:

-删除前:

```

8

/\

310

/\

16

//\

4714

\/

13

```

-删除后:

```

13

/\

310

/\

16

//\

4714

```

(四)边界情况处理

1.根节点删除:

-需要找到新的根节点(通常为中序后继或前驱),并将根节点指针指向该节点。

-如果新根节点有子节点,需要将其移动到原树中。

2.空树删除:

-无法删除,返回删除失败或空操作。

3.未找到节点:

-遍历完成后未找到指定键值的节点,返回删除失败。

4.删除不存在的键值:

-与未找到节点情况相同。

5.删除导致树结构严重退化:

-虽然二叉搜索树删除操作不会自平衡,但如果连续删除导致树高度接近线性,性能会下降。在实际应用中可结合AVL树或红黑树等自平衡二叉搜索树。

四、插入与删除的效率分析

(一)插入操作

-时间复杂度:

-平均情况:O(logn),树相对平衡时,每次插入只需遍历树的高度。

-最坏情况:O(n),树完全退化成链表,每次插入需要遍历所有节点。

-影响因素:树的高度。

-空间复杂度:

-O(n),用于存储树中的所有节点。

-递归实现时,空间复杂度为O(h),h为树的高度。

-优化方法:

-确保插入顺序尽量随机,避免构建极端不平衡的树。

-使用自平衡二叉搜索树。

(二)删除操作

-时间复杂度:

-平均情况:O(logn),查找目标节点和中序后继/前驱的时间复杂度均为O(logn)。

-最坏情况:O(n),与查找和删除操作相关的节点数量接近n(例如删除根节点及其所有子节点)。

-影响因素:树的平衡性。

-空间复杂度:

-O(logn),主要来自递归调用栈或迭代过程中的临时变量。

-优化方法:

-与插入类似,保持树的平衡。

-使用自平衡二叉搜索树。

五、总结

二叉搜索树的插入和删除操作是维护其有序性的核心机制。插入操作通过比较键值大小逐层查找空位置完成,而删除操作则根据节点子节点数量分情况处理,双子节点删除通常通过中序后继/前驱替换实现。正确处理各种边界情况是确保操作正确性的关键。虽然基本的二叉搜索树在极端情况下效率会下降,但通过使用自平衡变体(如AVL树、红黑树),可以保证其操作时间复杂度始终为O(logn),使其在动态数据集中仍具有很高的实用价值。理解并熟练掌握这两种操作,是深入学习和应用二叉搜索树的基础。

一、概述

二叉搜索树(BinarySearchTree,BST)是一种基于键值有序存储的树形数据结构,其中每个节点的左子树仅包含键值小于该节点的节点,右子树仅包含键值大于该节点的节点。二叉搜索树的插入和删除操作是维护其有序性的关键,以下将详细说明这两种操作的具体步骤和实现方法。

二、二叉搜索树的插入操作

(一)插入步骤

1.创建新节点:生成一个包含键值的新节点,并初始化其左右子节点为空。

2.空树插入:如果二叉搜索树为空,则新节点成为根节点。

3.非空树插入:

(1)从根节点开始,比较新节点的键值与当前节点的键值。

(2)如果新节点的键值小于当前节点的键值,则移动到左子节点;否则移动到右子节点。

(3)重复步骤(2),直到找到空子节点位置,将新节点插入该位置。

(二)示例

假设插入键值序列[8,3,10,1,6,14,4,7,13]到空二叉搜索树中:

1.插入8,树为空,8成为根节点。

2.插入3,小于8,插入为左子节点。

3.插入10,大于8,插入为右子节点。

4.插入1,小于8且小于3,插入为3的左子节点。

5.插入6,大于3且小于8,插入为3的右子节点。

6.插入14,大于8且大于10,插入为10的右子节点。

7.插入4,大于3且小于6,插入为6的左子节点。

8.插入7,大于6且小于8,插入为6的右子节点。

9.插入13,大于10且小于14,插入为14的左子节点。

三、二叉搜索树的删除操作

(一)删除步骤

1.查找目标节点:通过遍历二叉搜索树定位待删除节点。

2.删除节点分类:

(1)叶节点:直接删除节点,父节点的对应子节点指针置为空。

(2)单子节点:删除节点后,用其子节点替代该节点位置。

(3)双子节点:

a.找到待删除节点的中序后继(右子树的最小节点)或中序前驱(左子树的最大节点)。

b.将后继/前驱的键值替换到待删除节点。

c.删除后继/前驱节点(此时变为单子节点或叶节点,可按前述规则处理)。

(二)示例

假设删除键值序列[8,3,10,1,6,14,4,7,13]中的7:

1.查找节点7,发现其左右子节点均存在。

2.找到节点7的右子树最小节点13(中序后继)。

3.将13的键值替换到节点7,节点7变为13。

4.删除原节点13,其为叶节点,直接删除。

(三)边界情况处理

1.根节点删除:删除根节点后,选择新的根节点(如中序后继)替代。

2.空树删除:无操作。

3.未找到节点:返回删除失败提示。

四、插入与删除的效率分析

(一)插入操作

-时间复杂度:平均O(logn),最坏O(n)(树退化成链表)。

-空间复杂度:O(n),用于存储树节点。

(二)删除操作

-时间复杂度:平均O(logn),最坏O(n)。

-空间复杂度:O(logn),递归栈或迭代过程中的临时变量。

五、总结

二叉搜索树的插入和删除操作通过维护节点间的键值有序性,保证了树的搜索效率。正确处理不同类型的节点(叶节点、单子节点、双子节点)是确保树结构完整性的关键。在实际应用中,可通过平衡二叉搜索树(如AVL树、红黑树)进一步优化性能。

一、概述

二叉搜索树(BinarySearchTree,BST)是一种基于键值有序存储的树形数据结构,其中每个节点的左子树仅包含键值小于该节点的节点,右子树仅包含键值大于该节点的节点。二叉搜索树的插入和删除操作是维护其有序性的关键,以下将详细说明这两种操作的具体步骤和实现方法。二叉搜索树的性质是其所有操作的基础,必须首先明确:

(一)二叉搜索树的性质

1.对于任何节点N,N的左子树中所有节点的键值均小于N的键值。

2.对于任何节点N,N的右子树中所有节点的键值均大于N的键值。

3.左子树和右子树本身也必须是一棵二叉搜索树。

4.没有重复的键值节点(根据具体实现,通常允许或禁止重复)。

二、二叉搜索树的插入操作

(一)插入步骤

1.创建新节点:生成一个包含键值的新节点,并初始化其左右子节点指针为`null`(或空指针)。节点通常还包含其他字段,如数据值、左右子节点引用等。

示例代码片段(伪代码):

```

NodenewNode=newNode(keyValue);

newNode.left=null;

newNode.right=null;

```

2.空树插入:如果二叉搜索树当前为空(根节点为`null`),则新节点成为根节点。

操作步骤:

(1)检查根节点是否为`null`。

(2)如果为`null`,将新节点赋值给根节点。

```

if(root==null){

root=newNode;

}

```

3.非空树插入:如果二叉搜索树不为空,则按照键值大小关系逐层查找插入位置。

(1)初始化当前节点为根节点。

(2)比较新节点的键值与当前节点的键值。

(3)如果新节点的键值小于当前节点的键值:

-如果当前节点的左子节点为`null`,则将新节点插入为当前节点的左子节点。

-如果当前节点的左子节点不为`null`,则将当前节点更新为其左子节点,并返回步骤(2)。

(4)如果新节点的键值大于或等于当前节点的键值(根据是否允许重复键值处理):

-如果允许重复,且键值等于当前节点,可以选择插入到左或右(例如,统一插入左子树)。

-如果不允许重复,且键值等于当前节点,则不插入并返回。

-如果当前节点的右子节点为`null`,则将新节点插入为当前节点的右子节点。

-如果当前节点的右子节点不为`null`,则将当前节点更新为其右子节点,并返回步骤(2)。

```

Nodecurrent=root;

Nodeparent=null;//用于记录父节点

while(current!=null){

parent=current;

if(newNode.keyValue<current.keyValue){

current=current.left;

}elseif(newNode.keyValue>current.keyValue){//或者处理等于的情况

current=current.right;

}else{

//键值已存在,根据需求处理(例如插入左子树)

current=current.left;

}

}

//current==null时,parent是插入位置

if(newNode.keyValue<parent.keyValue){

parent.left=newNode;

}else{

parent.right=newNode;

}

```

(二)示例

假设插入键值序列[8,3,10,1,6,14,4,7,13]到空二叉搜索树中,并展示每一步的树结构变化:

1.插入8:树为空,8成为根节点。

```

8

```

2.插入3,小于8,插入为8的左子节点。

```

8

/

3

```

3.插入10,大于8,插入为8的右子节点。

```

8

/\

310

```

4.插入1,小于8且小于3,插入为3的左子节点。

```

8

/\

310

/

1

```

5.插入6,大于3且小于8,插入为3的右子节点。

```

8

/\

310

/\

16

```

6.插入14,大于8且大于10,插入为10的右子节点。

```

8

/\

310

/\

16

\

14

```

7.插入4,大于3且小于6,插入为6的左子节点。

```

8

/\

310

/\

16

//

414

```

8.插入7,大于6且小于8,插入为6的右子节点。

```

8

/\

310

/\

16

//\

4714

```

9.插入13,大于10且小于14,插入为14的左子节点。

```

8

/\

310

/\

16

//\

4714

\/

13

```

三、二叉搜索树的删除操作

(一)删除步骤

删除操作相对复杂,需要根据待删除节点的子节点情况分情况处理。主要步骤如下:

1.查找目标节点:通过遍历二叉搜索树定位待删除节点(记为`targetNode`)。

-使用递归或迭代方式,比较键值并沿左或右子树查找。

-同时记录`targetNode`的父节点(记为`parentNode`)。

2.确定节点类型并执行删除:根据`targetNode`的子节点数量进行分类处理。

(1)删除叶节点(无子节点):

a.检查`targetNode`是否为左子节点(`parentNode.left==targetNode`)。

b.如果是,将`parentNode.left`指针置为`null`。

c.如果不是,将`parentNode.right`指针置为`null`。

d.删除`targetNode`占用的内存空间(在编程语言中)。

(2)删除单子节点(一个子节点):

a.检查`targetNode`有一个左子节点或右子节点。

b.假设`targetNode`有左子节点(右子节点逻辑相同):

-将`targetNode`的左子节点提升到`targetNode`的位置。

-更新`parentNode`的对应指针(左或右)指向`targetNode`的左子节点。

c.假设`targetNode`有右子节点:

-将`targetNode`的右子节点提升到`targetNode`的位置。

-更新`parentNode`的对应指针指向`targetNode`的右子节点。

d.删除`targetNode`占用的内存空间。

(3)删除双子节点(左右子节点均存在):

a.寻找中序后继:

-中序后继是`targetNode`右子树中的最小节点(即最左侧节点)。

-从`targetNode.right`开始,不断向左移动,直到到达最左侧节点(`inorderSuccessor`)。

-记录`inorderSuccessor`的父节点(`inorderSuccessorParent`)。

b.寻找中序前驱(作为替代方案):

-中序前驱是`targetNode`左子树中的最大节点(即最右侧节点)。

-从`targetNode.left`开始,不断向右移动,直到到达最右侧节点(`inorderPredecessor`)。

-记录`inorderPredecessor`的父节点(`inorderPredecessorParent`)。

c.替换键值:

-选择中序后继或中序前驱(通常选择后继,因为前驱可能需要同时处理其右子树)。

-将`inorderSuccessor.keyValue`的值复制到`targetNode.keyValue`。

d.删除原后继节点:

-`inorderSuccessor`节点现在成为叶节点或单子节点(因为它取代了`targetNode`的位置,其原来的子节点现在直接挂在`inorderSuccessor`下)。

-根据其子节点情况执行删除叶节点或单子节点的操作(步骤(1)或(2))。

3.更新根节点(如果需要):如果删除的是根节点,则根节点指针需要指向新的树根(通常由步骤(2)c中的替换操作间接完成)。

4.返回结果:返回删除成功或未找到节点的指示。

(二)示例

假设删除键值序列[8,3,10,1,6,14,4,7,13]中的7:

1.查找节点7:

-从根节点8开始,7小于8,移动到3。

-7大于3,移动到6。

-7大于6,移动到7节点,找到目标节点。

-记录父节点为6。

2.确定节点类型:节点7是叶节点(无子节点)。

3.执行删除:

-检查`parentNode`(6)的右子节点是否为`targetNode`(7)。是。

-将`parentNode.right`指针置为`null`(即`6.right=null`)。

-删除节点7占用的内存空间。

4.结果树结构(对比删除前):

```

8

/\

310

/\

16

//\

4714

\/

13

```

删除节点7后:

```

8

/\

310

/\

16

//

414

/

13

```

(三)示例(双子节点删除)

假设删除键值序列[8,3,10,1,6,14,4,7,13]中的8(根节点):

1.查找节点8:

-根节点就是8,`parentNode`为`null`。

2.确定节点类型:节点8是双子节点(左子节点3和右子节点10)。

3.寻找中序后继:

-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论