《大話數(shù)據(jù)結(jié)構(gòu)》學(xué)習(xí)筆記五

第6章 樹

樹(Tree)是 n(n≥0)個(gè)結(jié)點(diǎn)的有限集。n=0 時(shí)稱為空樹。在任意一棵非空樹中:(1)有且僅有一個(gè)特定的稱為根(Root)的結(jié)點(diǎn);(2)當(dāng) n>1 時(shí),其余結(jié)點(diǎn)可分為 m(m>0)個(gè)互不相交的有限集 T1、T2、……、Tm,其中每一個(gè)集合本身又是一棵樹,并且稱為根的子樹(SubTree)。

樹的定義

樹(Tree)是 n(n≥0)個(gè)結(jié)點(diǎn)的有限集。n=0 時(shí)稱為空樹。在任意一棵非空樹中:(1)有且僅有一個(gè)特定的稱為根(Root)的結(jié)點(diǎn);(2)當(dāng) n>1 時(shí),其余結(jié)點(diǎn)可分為 m(m>0)個(gè)互不相交的有限集 T1、T2、……、Tm,其中每一個(gè)集合本身又是一棵樹,并且稱為根的子樹(SubTree)。

結(jié)點(diǎn)分類

樹的結(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素及若干指向其子樹的分支。

結(jié)點(diǎn)擁有的子樹數(shù)稱為結(jié)點(diǎn)的度(Degree)。度為 0 的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)(Leaf)或終端結(jié)點(diǎn);度不為 0 的結(jié)點(diǎn)稱為非終端結(jié)點(diǎn)或分支結(jié)點(diǎn)。除根結(jié)點(diǎn)之外,分支結(jié)點(diǎn)也稱為內(nèi)部結(jié)點(diǎn)。樹的度是樹內(nèi)各結(jié)點(diǎn)的度的最大值。

結(jié)點(diǎn)間關(guān)系

結(jié)點(diǎn)的子樹的根稱為該結(jié)點(diǎn)的孩子(Child),相應(yīng)的,該結(jié)點(diǎn)稱為孩子的雙親(Parent)。同一個(gè)雙親的孩子之前互稱兄弟(Sibling)。結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn)。反之,以某結(jié)點(diǎn)為根的子樹中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫。

樹的其他相關(guān)概念

結(jié)點(diǎn)的層次(Level)從根開始定義起,根為第一層,根的孩子為第二層。若某結(jié)點(diǎn)在第 1 層,則其子樹的根就在第 i+1 層。其雙親在同一層的結(jié)點(diǎn)互為堂兄弟。樹中結(jié)點(diǎn)的最大層次稱為樹的深度(Depth)或高度。

如果將樹中結(jié)點(diǎn)的各子樹看成從左至右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹。

森林(Forest)是 m(m≥0)棵互不相交的樹的集合。

線性表與樹結(jié)構(gòu)

線性結(jié)構(gòu) 樹結(jié)構(gòu)
第一個(gè)數(shù)據(jù)元素:無前驅(qū) 根結(jié)點(diǎn):無雙親,唯一
最后一個(gè)數(shù)據(jù)元素:無后繼 葉結(jié)點(diǎn):無孩子,可以多個(gè)
中間元素:一個(gè)前驅(qū)一個(gè)后繼 中間結(jié)點(diǎn):一個(gè)雙親多個(gè)孩子

樹的抽象數(shù)據(jù)類型

ADT 樹(tree)

Data

樹是由一個(gè)根結(jié)點(diǎn)和若干子樹構(gòu)成。樹中結(jié)點(diǎn)具有相同數(shù)據(jù)類型及層次關(guān)系。

Operation

InitTree(*T):構(gòu)造空樹 T。

DestroyTree(*T):銷毀樹 T。

CreateTree(*T, definition):按 definition 中給出樹的定義來構(gòu)造樹。

ClearTree(*T):若樹 T 存在,則將樹 T 清為空樹。

TreeEmpty(*T):若 T 為空樹,返回 true,否則返回 false。

TreeDepth(T):返回 T 的深度。

Root(T):返回樹的根結(jié)點(diǎn)。

Value(T, cur_e):cur_e 是樹 T 中一個(gè)結(jié)點(diǎn),返回此結(jié)點(diǎn)的值。

Assign(T, cur_e,value):給樹 T 的結(jié)點(diǎn) cur_e 賦值為 value。

Parent(T, cur_e):若 cur_e 是樹 T 的非根結(jié)點(diǎn),則返回它的雙親,否則返回空。

LeftChild(T, cur_e):若 cur_e 是樹 T 的非葉結(jié)點(diǎn),則返回它的最左孩子,否則返回空。

RightSibling(T, cur_e):若 cur_e 有右兄弟,則返回它的右兄弟,否則返回空。

InsertChild(*T, *p, i, c):其中 p 指向樹 T 的某個(gè)結(jié)點(diǎn),i 為所指結(jié)點(diǎn) p 的度加上1,非空樹 c 與 T 不相交,操作結(jié)果為插入 c 為樹 T 中 p 指結(jié)點(diǎn)的第 i 棵子樹。

DeleteChild(*T, *p, i):其中 p 指向樹 T 的某個(gè)結(jié)點(diǎn),i 為所指結(jié)點(diǎn) p 的度,操作結(jié)果為刪除 T 中 p 所指結(jié)點(diǎn)的第 i 棵子樹。

endADT

樹的存儲(chǔ)結(jié)構(gòu)

雙親表示法

我們假設(shè)以一組連續(xù)空間存儲(chǔ)樹的結(jié)點(diǎn),同時(shí)在每個(gè)結(jié)點(diǎn)中,附設(shè)一個(gè)指示器表示其雙親結(jié)點(diǎn)在數(shù)組中的位置。也就是說,每個(gè)結(jié)點(diǎn)除了知道自己是誰以外,還知道它的雙親在哪里。

以下是我們的雙親表示法的結(jié)點(diǎn)結(jié)構(gòu)定義代碼。

/* 樹的雙親表示法結(jié)點(diǎn)結(jié)構(gòu)定義 */
#define MAX_TREE_SIZE 100
typedef int TElemType; /* 樹結(jié)點(diǎn)的數(shù)據(jù)類型,目前暫定為整型 */
typedef struct PTNode /* 結(jié)點(diǎn)結(jié)構(gòu) */
{
  TElemType data; /* 結(jié)點(diǎn)數(shù)據(jù) */
  int parent; /* 雙親位置 */
} PTNode;
typedef struct  /* 樹結(jié)構(gòu) */
{
  PTNode nodes[MAX_TREE_SIZE]; /* 結(jié)點(diǎn)數(shù)組 */
  int r,n;  /* 根的位置和結(jié)點(diǎn)數(shù) */
} PTree

存儲(chǔ)結(jié)構(gòu)的設(shè)計(jì)是一個(gè)非常靈活的過程。一個(gè)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)的是否合理,取決于基于該存儲(chǔ)結(jié)構(gòu)的運(yùn)算是否合適、是否方便,時(shí)間復(fù)雜度好不好等。

孩子表示法

由于樹中每個(gè)結(jié)點(diǎn)可能有多棵子樹,可以考慮用多重鏈表,即每個(gè)結(jié)點(diǎn)有多個(gè)指針域,其中每個(gè)指針指向一棵子樹的根結(jié)點(diǎn),我們把這種方法叫做多重鏈表表示法。

孩子表示法。把每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來,以單鏈表作存儲(chǔ)結(jié)構(gòu),則 n 個(gè)結(jié)點(diǎn)有 n 個(gè)孩子鏈表,如果是葉子結(jié)點(diǎn)則此單鏈表為空。然后 n 個(gè)頭指針又組成一個(gè)線性表,采用順序存儲(chǔ)結(jié)構(gòu),放進(jìn)一個(gè)一維數(shù)組中。

以下是我們的孩子表示法的結(jié)構(gòu)定義代碼。

/* 樹的孩子表示法結(jié)構(gòu)定義 */
#define MAX_TREE_SIZE 100
typedef struct CTNode /* 孩子結(jié)點(diǎn) */
{
  int child;
  struct CTNode *next;
} *ChildPtr;
typedef struct /* 表頭結(jié)構(gòu) */
{
  TElemType data;
  ChildPtr firstchild;
} CTBox;
typedef struct /* 樹結(jié)構(gòu) */
{
  CTBox nodes[MAX_TREE_SIZE]; /* 結(jié)點(diǎn)數(shù)組 */
  int r,n; /* 根的位置和結(jié)點(diǎn)數(shù) */
} CTree;

孩子兄弟表示法

任意一棵樹,它的結(jié)點(diǎn)的第一個(gè)孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們?cè)O(shè)置兩個(gè)指針,分別指向該結(jié)點(diǎn)的第一個(gè)孩子和此結(jié)點(diǎn)的右兄弟。

結(jié)構(gòu)定義代碼如下。

/* 樹的孩子兄弟表示法結(jié)構(gòu)定義 */
typedef struct CSNode
{
  TElemType data;
  struct CSNode *fistchild,*rightsib;
} CSNode, *CSTree;

二叉樹的定義

二叉樹(Binary Tree)是 n(n≥0)個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的、分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。

二叉樹特點(diǎn)

二叉樹的特點(diǎn)有:

  • 每個(gè)結(jié)點(diǎn)最多有兩棵子樹,所以二叉樹中不存在度大于 2 的結(jié)點(diǎn)。注意不是只有兩棵子樹,而是最多有。沒有子樹或者一棵子樹都是可以的。
  • 左子樹和右子樹是有順序的,次序不能任意顛倒。
  • 即使樹中某個(gè)結(jié)點(diǎn)只有一棵子樹,也要區(qū)分它是左子樹還是右子樹。

二叉樹具有五種基本形態(tài):

  1. 空二叉樹。
  2. 只有一個(gè)根結(jié)點(diǎn)。
  3. 根結(jié)點(diǎn)只有左子樹。
  4. 根結(jié)點(diǎn)只有右子樹。
  5. 根結(jié)點(diǎn)既有左子樹又有右子樹。

特殊二叉樹

1. 斜樹

所有的結(jié)點(diǎn)都只有左子樹的二叉樹叫左斜樹。所有結(jié)點(diǎn)都是只有右子樹的二叉樹叫右斜樹。這兩者統(tǒng)稱為斜樹。

2. 滿二叉樹

在一棵二叉樹中,如果所有分支結(jié)點(diǎn)都存在左子樹和右子樹,并且所有葉子都在同一層,這樣的二叉樹稱為滿二叉樹。

滿二叉樹的特點(diǎn)有:

(1)葉子只能出現(xiàn)在最下一層。

(2)非葉子結(jié)點(diǎn)的度一定是 2。

(3)在同樣深度的二叉樹中,滿二叉樹的結(jié)點(diǎn)個(gè)數(shù)最多,葉子樹最多。

3. 完全二叉樹

對(duì)一棵具有 n 個(gè)結(jié)點(diǎn)的二叉樹按層序編號(hào),如果編號(hào)為 i(1≤i≤n)的結(jié)點(diǎn)與同樣深度的滿二叉樹中編號(hào)為 i 的結(jié)點(diǎn)在二叉樹中位置完全相同,則這棵二叉樹稱為完全二叉樹。

完全二叉樹的特點(diǎn):

(1)葉子結(jié)點(diǎn)只能出現(xiàn)在最下兩層。

(2)最下層的葉子一定集中在左部連續(xù)位置。

(3)倒數(shù)二層,若有葉子結(jié)點(diǎn),一定都在右部連續(xù)位置。

(4)如果結(jié)點(diǎn)度為1,則該結(jié)點(diǎn)只有左孩子,即不存在只有右子樹的情況。

(5)同樣結(jié)點(diǎn)的二叉樹,完全二叉樹的深度最小。

判斷某個(gè)二叉樹是否是完全二叉樹的辦法,就是看著樹的示意圖,心中默默給每個(gè)結(jié)點(diǎn)按照滿二叉樹的結(jié)構(gòu)逐層順序編號(hào),如果編號(hào)出現(xiàn)空擋,就說明不是完全二叉樹,否則就是。

二叉樹的性質(zhì)

二叉樹的性質(zhì)1

性質(zhì)1:在二叉樹的第 i 層上至多有 2i-1 個(gè)結(jié)點(diǎn)(i≥1)。

二叉樹的性質(zhì)2

性質(zhì)2:深度為 k 的二叉樹至多有 2k-1 個(gè)結(jié)點(diǎn)(k≥1)。

二叉樹的性質(zhì)3

性質(zhì)3:對(duì)任何一棵二叉樹 T,如果其終端結(jié)點(diǎn)數(shù)為 n0,度為 2 的結(jié)點(diǎn)數(shù)為 n2,則 n0=n2+1。

二叉樹的性質(zhì)4

性質(zhì)4:具有 n 個(gè)結(jié)點(diǎn)的完全二叉樹的深度為 ?log2n?+1 ( ?x?表示不大于 x 的最大整數(shù))。

注:?? 向下取整運(yùn)算。

二叉樹的性質(zhì)5

性質(zhì)5:如果對(duì)于一棵有 n 個(gè)結(jié)點(diǎn)的完全二叉樹(其深度為 ?log2n?+1)的結(jié)點(diǎn)按層序編號(hào)(從第 1 層到第 ?log2n?+1 層),每層從左到右,對(duì)任一結(jié)點(diǎn) i (1≤i≤n)有:

  1. 如果 i = 1,則結(jié)點(diǎn) i 是二叉樹的根,無雙親;如果 i>1,則其雙親是結(jié)點(diǎn) ?i/2?。
  2. 如果 2i>n,則結(jié)點(diǎn) i 無左孩子(結(jié)點(diǎn) i 為葉子結(jié)點(diǎn));否則其左孩子是結(jié)點(diǎn) 2i。
  3. 如果 2i+1>n,則結(jié)點(diǎn) i 無右孩子;否則其右孩子是結(jié)點(diǎn) 2i+1。

二叉樹的存儲(chǔ)結(jié)構(gòu)

二叉樹順序存儲(chǔ)結(jié)構(gòu)

順序存儲(chǔ)結(jié)構(gòu)一般只用于完全二叉樹。

二叉鏈表

二叉樹每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為它設(shè)計(jì)一個(gè)數(shù)據(jù)域和兩個(gè)指針域是比較自然的想法,我們稱這樣的鏈表叫做二叉鏈表。

以下是我們的二叉鏈表的結(jié)點(diǎn)結(jié)構(gòu)定義代碼。

/* 二叉樹的二叉鏈表結(jié)點(diǎn)結(jié)構(gòu)定義 */
typedef struct BitNode /* 結(jié)點(diǎn)結(jié)構(gòu) */
{
  TElemType data; /* 結(jié)點(diǎn)數(shù)據(jù) */
  struct BiTNode *lchild, *rchild; /* 左右孩子指針 */
} BiTNode, *BiTree;

遍歷二叉樹

二叉樹遍歷原理

二叉樹的遍歷(traversing biary tree)是指從根結(jié)點(diǎn)出發(fā),按照某種次序依次訪問二叉樹中所有結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)被訪問一次且僅被訪問一次。

二叉樹遍歷方法

1. 前序遍歷

規(guī)則是若二叉樹為空,則空操作返回,否則先訪問根結(jié)點(diǎn),然后前序遍歷左子樹,再前序遍歷右子樹。

2. 中序遍歷

規(guī)則是若樹為空,則空操作返回,否則從根結(jié)點(diǎn)開始(注意不是先訪問根結(jié)點(diǎn)),中序遍歷根結(jié)點(diǎn)的左子樹,然后是訪問根結(jié)點(diǎn),最后中序遍歷右子樹。

3. 后序遍歷

規(guī)則是若樹為空,則空操作返回,否則從左到右先葉子后結(jié)點(diǎn)的方式遍歷訪問左右子樹,最后是訪問根結(jié)點(diǎn)。

4. 層序遍歷

規(guī)則是若樹為空,則空操作返回,否則從樹的第一層,也就是根結(jié)點(diǎn)開始訪問,從上而下逐層遍歷,在同一層中,按從左到右的順序?qū)Y(jié)點(diǎn)逐個(gè)訪問。

前序遍歷算法

/* 二叉樹的前序遍歷遞歸算法 */
void PreOrderTraverse (BiTree T)
{
  if (T==NULL)
    return;
  printf("%c",T->data); /* 顯示結(jié)點(diǎn)數(shù)據(jù),可以更改為其他對(duì)結(jié)點(diǎn)操作 */
  PreOrderTraverse (T->lchild); /* 再先序遍歷左子樹 */
  PreOrderTraverse (T->rchild); /* 最后先序遍歷右子樹 */
}

中序遍歷算法

/* 二叉樹的中序遍歷遞歸算法 */
void InOrderTraverse (BiTree T)
{
  if (T==NULL)
    return;
  InOrderTraverse (T->lchild); /* 中序遍歷左子樹 */
  printf("%c",T->data); /* 顯示結(jié)點(diǎn)數(shù)據(jù),可以更改為其他對(duì)結(jié)點(diǎn)操作 */
  InOrderTraverse (T->rchild); /* 最后中序遍歷右子樹 */
}

后序遍歷算法

/* 二叉樹的后序遍歷遞歸算法 */
void PostOrderTraverse (BiTree T)
{
  if (T==NULL)
    return;
  PostOrderTraverse (T->lchild); /* 先后序遍歷左子樹 */
  PostOrderTraverse (T->rchild); /* 再后序遍歷右子樹 */
  printf("%c",T->data); /* 顯示結(jié)點(diǎn)數(shù)據(jù),可以更改為其他對(duì)結(jié)點(diǎn)操作 */
}

推導(dǎo)遍歷結(jié)果

  • 已知前序遍歷序列和中序遍歷序列,可以唯一確定一棵二叉樹。
  • 已知后序遍歷序列和中序遍歷序列,可以唯一確定一棵二叉樹。
  • 已知前序和后序遍歷,是不能唯一確定一棵二叉樹的。

二叉樹的建立

/* 按前序輸入二叉樹中結(jié)點(diǎn)的值(一個(gè)字符) */
/* #表示空樹,構(gòu)造二叉鏈表表示二叉樹 T。 */
void CreateBiTree (BiTree *T)
{
  TElemType ch;
  scanf("%c",&ch);
  if (ch=='#')
    *T=NULL;
  else
  {
    *T=(BiTree)malloc(sizeof(BiTNode));
    if (!*T)
      exit (OVERFLOW);
    (*T)->data=ch; /* 生成根結(jié)點(diǎn) */
    CreateBiTree(&(*T)->lchild); /* 構(gòu)造左子樹 */
    CreateBiTree(&(*T)->rchild); /* 構(gòu)造右子樹 */
  }
}

線索二叉樹

線索二叉樹原理

指向前驅(qū)和后繼的指針稱為線索,加上線索的二叉鏈表稱為線索鏈表,相應(yīng)的二叉樹就稱為線索二叉樹(Threaded Binary Tree)。

對(duì)二叉樹以某種次序遍歷使其變?yōu)榫€索二叉樹的過程叫做是線索化。

線索二叉樹結(jié)構(gòu)實(shí)現(xiàn)

/* 二叉樹的二叉線索存儲(chǔ)結(jié)構(gòu)定義 */
typedef enum (Link, Thread) PointerTag; /* Link==0 表示指向左右孩子指針 Thread==1 表示指向前驅(qū)或后繼的線索 */
typedef struct BiThrNode /* 二叉線索存儲(chǔ)結(jié)點(diǎn)結(jié)構(gòu) */
{
  TElemType data; /* 結(jié)點(diǎn)數(shù)據(jù) */
  struct BiThrNode *lchild, *rchild; /* 左右孩子指針 */
  PointerTag LTag;
  PointerTag RTag; /* 左右標(biāo)志 */
} BiThrNode, *BiThrTree;

線索化的過程就是在遍歷的過程中修改空指針的過程。

如果所用的二叉樹需經(jīng)常遍歷或查找結(jié)點(diǎn)時(shí)需要某種遍歷序列中的前驅(qū)和后繼,那么采用線索二叉鏈表的存儲(chǔ)結(jié)構(gòu)就是非常不錯(cuò)的選擇。

樹、森林與二叉樹的轉(zhuǎn)換

樹轉(zhuǎn)換為二叉樹

將樹轉(zhuǎn)換為二叉樹的步驟如下

  1. 加線。在所有兄弟結(jié)點(diǎn)之間加一條連線。
  2. 去線。對(duì)樹中每個(gè)結(jié)點(diǎn),只保留它與第一個(gè)孩子結(jié)點(diǎn)的連線,刪除它與其他孩子結(jié)點(diǎn)之間的連線。
  3. 層次調(diào)整。以樹的根結(jié)點(diǎn)為軸心,將整棵樹順時(shí)針旋轉(zhuǎn)一定的角度,使之結(jié)構(gòu)層次分明。注意第一個(gè)孩子是二叉樹結(jié)點(diǎn)的左孩子,兄弟轉(zhuǎn)換過來的孩子是結(jié)點(diǎn)的右孩子。

森林轉(zhuǎn)換為二叉樹

步驟如下:

  1. 將每個(gè)樹轉(zhuǎn)換為二叉樹。
  2. 第一棵二叉樹不動(dòng),從第二棵二叉樹開始,依次把后一棵二叉樹的根結(jié)點(diǎn)作為前一棵二叉樹的根結(jié)點(diǎn)的右孩子,用線連接起來。當(dāng)所有的二叉樹連接起來后就得到了由森林轉(zhuǎn)換來的二叉樹。

二叉樹轉(zhuǎn)換為樹

  1. 加線。
  2. 去線。
  3. 層次調(diào)整。

二叉樹轉(zhuǎn)換為森林

  1. 從根結(jié)點(diǎn)開始,若右孩子存在,則把右孩子結(jié)點(diǎn)的連線刪除,再查看分離后的二叉樹,若右孩子存在,則連線刪除……,直到所有右孩子連線都刪除為止,得到分離的二叉樹。
  2. 再將每棵分離的二叉樹轉(zhuǎn)換為樹即可。

樹與森林的遍歷

樹的遍歷分為兩種方式。

  1. 一種是先根遍歷樹,即先訪問樹的根結(jié)點(diǎn),然后依次先根遍歷根的每棵子樹。
  2. 另一種是后根遍歷,即先依次后根遍歷每棵子樹,然后再訪問根結(jié)點(diǎn)。

森林的遍歷也分為兩種方式:

  1. 前序遍歷
  2. 后序遍歷

赫夫曼樹及其應(yīng)用

赫夫曼樹定義與原理

從樹中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的分支構(gòu)成兩個(gè)結(jié)點(diǎn)之間的路徑,路徑上的分支數(shù)目稱做路徑長(zhǎng)度。

樹的路徑長(zhǎng)度就是從樹根到每一個(gè)結(jié)點(diǎn)的路徑長(zhǎng)度之和。

帶權(quán)路徑長(zhǎng)度 WPL 最小的二叉樹稱做赫夫曼樹。

赫夫曼編碼

一般地,設(shè)需要編碼的字符集為{d1,d2,…,dn},各個(gè)字符在電文中出現(xiàn)的次數(shù)或頻率集合為 {w1,w2,…,wn},以 d1,d2,…,dn 作為葉子結(jié)點(diǎn),以 w1,w2,…,wn 作為相應(yīng)葉子結(jié)點(diǎn)的權(quán)值來構(gòu)造一棵赫夫曼樹。規(guī)定赫夫曼樹的左分支代表 0,右分支代表 1,則從根結(jié)點(diǎn)到葉子結(jié)點(diǎn)所經(jīng)過的路徑分支組成的 0 和 1 的序列便為該結(jié)點(diǎn)對(duì)應(yīng)字符的編碼,這就是赫夫曼編碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容