国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹

這篇具有很好參考價值的文章主要介紹了你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??? 文章由@不準備禿的大偉原創(chuàng) ???

??? 若有轉(zhuǎn)載,請聯(lián)系博主哦~????

??? 致力學(xué)好編程的寶藏博主,代碼興國!???

? ? ? ? halo鐵汁們,沒錯又是你們?nèi)艘娙藧?,花見花開的大偉啊,今天也是周六,大偉心情也是非常的美妙啊~ 所以就迫不及待的給大家來更新我們的博客啦,那么今天要學(xué)習(xí)的內(nèi)容就是大家早已棋盤不已的二叉樹啦,但是在學(xué)習(xí)二叉樹之前,鐵汁們有沒有把堆認真的學(xué)完呢?沒有?趕快去看!:堆?

? ? ? ? OK,那么廢話不多說,我們開始今天的學(xué)習(xí)內(nèi)容吧!

? ? ? ? 那么我們上一篇博客也是簡單的介紹了一下二叉樹的基本概念,那么今天我們就來看一看二叉樹的一些操作以及代碼的實現(xiàn)。

? ? ? ? 首先呢,我們先來思考一下一個很重要的問題:我們的二叉樹,用什么方法實現(xiàn)好呢?是數(shù)組,還是鏈式結(jié)構(gòu)?

? ? ? ? 回想一下,我們的堆是不是用數(shù)組的方法實現(xiàn)的,但是有一點不知道大家有沒有注意到大偉上一篇在介紹堆時說的一句話:“堆的邏輯結(jié)構(gòu)是啥樣的?和完全二叉樹一個樣”,也就是說,我們的完全二叉樹也就是用和堆一樣的實現(xiàn)方法:數(shù)組(這樣可以保證數(shù)據(jù)浪費量很小,大家可以想一想為什么)。

????????那么問題來了,如果是別的二叉樹呢?如果深度比較深,但是最后一層只有一個數(shù)據(jù)呢?這個時候的空間浪費是不是就是比較大了? 所以,普通的二叉樹(當(dāng)然包括完全二叉樹)我們使用鏈式結(jié)構(gòu)實現(xiàn)就比較銀杏。

????????在學(xué)習(xí)二叉樹的基本操作前,需先要創(chuàng)建一棵二叉樹,然后才能學(xué)習(xí)其相關(guān)的基本操作。由于現(xiàn)在大家對二叉樹結(jié)構(gòu)掌握還不夠深入,為了降低大家學(xué)習(xí)成本,咱們此刻手動快速創(chuàng)建一棵簡單的二叉樹,快速進入二叉樹的操作學(xué)習(xí),等二叉樹結(jié)構(gòu)了解的差不多時,我們反過頭再來研究二叉樹真正的創(chuàng)建方式。?OK不OK?(^▽^ )

? ? ? ? 鐵汁們還記得上一篇博客里面我們提到的二叉樹是怎么實現(xiàn)的嗎?沒錯,左孩子右兄弟法,于是我們結(jié)構(gòu)體中就需要一個left指針,一個right指針,還需要一個當(dāng)前節(jié)點的數(shù)據(jù)data。OK,前提需要已經(jīng)準備好了,現(xiàn)在,開碼!

? ? ? ? BT.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef char BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

// 通過前序遍歷的數(shù)組"ABD##E#H##CF##G##"構(gòu)建二叉樹(直接在.c中實現(xiàn))
BTNode* BTCreate();
// 二叉樹銷毀
void BinaryTreeDestory(BTNode* root);
// 二叉樹節(jié)點個數(shù)
int BinaryTreeSize(BTNode* root);
// 二叉樹葉子節(jié)點個數(shù)
int BinaryTreeLeafSize(BTNode* root);
// 二叉樹第k層節(jié)點個數(shù)
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉樹查找值為x的節(jié)點
BTNode* BinaryTreeFind(BTNode* root,int x);
// 二叉樹前序遍歷 
void BinaryTreePrevOrder(BTNode* root);
// 二叉樹中序遍歷
void BinaryTreeInOrder(BTNode* root);
// 二叉樹后序遍歷
void BinaryTreePostOrder(BTNode* root);
// 層序遍歷
void BinaryTreeLevelOrder(BTNode* root);
// 判斷二叉樹是否是完全二叉樹
int BinaryTreeComplete(BTNode* root);

? ? ? ? BT.c

? ? ? ? ? ? ? ? 手動創(chuàng)建一個二叉樹:

BTNode* BTCreate()
{
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);
	BTNode* n7 = BuyBTNode(7);

	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;
	n5->left = n7;
	return n1;
}

? ? ? ? 邏輯結(jié)構(gòu)如下:你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹,你真的學(xué)懂了數(shù)據(jù)結(jié)構(gòu)?,數(shù)據(jù)結(jié)構(gòu),c語言,算法

? ? ? ? ? ? ? ? 銷毀二叉樹:

void BinaryTreeDestory(BTNode* root)
{
	if (root == NULL) return;
    BinaryTreeDestory(root->left);
    BinaryTreeDestory(root->right);
//從根節(jié)點開始,遞歸釋放左右節(jié)點
    free(root);
}

????????????????二叉樹節(jié)點個數(shù):?

int BinaryTreeSize(BTNode* root)
{
//若根不為空,則遞歸向下找,每到一個節(jié)點加一
	return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

? ? ? ? ? ? ? ? ?二叉樹葉子節(jié)點個數(shù):

int BinaryTreeLeafSize(BTNode* root)
{
//若根為空
	if (root == NULL) return 0;
//若根不為空,但是沒有孩子節(jié)點,才加一
	if (root && root->left == NULL && root->right == NULL) return 1;
//遞歸向下尋找
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

????????????????二叉樹第k層節(jié)點個數(shù):

int BinaryTreeLevelKSize(BTNode* root, int k)
{
//若當(dāng)前節(jié)點為空,則返回為0
	if (root == NULL) return 0;
//若尋找到需要的尋找的層數(shù)的某一個節(jié)點,則返回1
	if (k == 1) return 1;
//從根依次往下找,并且使的k == 1時,就是需要的層數(shù)
	return BinaryTreeLevelKSize(root->left, --k) + BinaryTreeLevelKSize(root->right, --k);
}

????????????????二叉樹查找值為x的節(jié)點:

BTNode* BinaryTreeFind(BTNode* root,int x)
{
	if (root == NULL) return false;
	if (root->data == x) return root;
//若需要尋找的值不是根節(jié)點,則需要記錄一下后面的值為x的節(jié)點,以便于返回上一層
	BTNode* ret1 = BinaryTreeFind(root->left, x);
	if (ret1) return ret1;

	BTNode* ret2 = BinaryTreeFind(root->right, x);
	if (ret2) return ret2;

return NULL;
}

? ? ? ? 鐵汁們肯定還不知道前序遍歷是個啥玩意吧,哈哈。那么乘次機會,大偉把前序遍歷,中序遍歷,后序遍歷已經(jīng)層序遍歷都給大家講一講:

????????學(xué)習(xí)二叉樹結(jié)構(gòu),最簡單的方式就是遍歷。所謂二叉樹遍歷(Traversal)是按照某種特定的規(guī)則,依次對二叉 樹中的節(jié)點進行相應(yīng)的操作,并且每個節(jié)點只操作一次。訪問結(jié)點所做的操作依賴于具體的應(yīng)用問題。 遍歷 是二叉樹上最重要的運算之一,也是二叉樹上進行其它運算的基礎(chǔ)。

1. 前序遍歷 —— 訪問根結(jié)點的操作發(fā)生在遍歷其左右子樹之前。

2. 中序遍歷 —— 訪問根結(jié)點的操作發(fā)生在遍歷其左右子樹之中(間)。

3. 后序遍歷 —— 訪問根結(jié)點的操作發(fā)生在遍歷其左右子樹之后。

4. 層序遍歷 —— 從根節(jié)點開始按照一層一層的訪問節(jié)點?

? ? ? ? 實例如下圖:?你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹,你真的學(xué)懂了數(shù)據(jù)結(jié)構(gòu)?,數(shù)據(jù)結(jié)構(gòu),c語言,算法

? ? ? ? 前序遍歷是:?1 2 4 N N 5 N N 3 6 N N 7 N N

? ? ? ? 中序遍歷是: N 4 N 2 N 5 N 1 N 6 N 3 N 7 N

? ? ? ? 后序遍歷是:?N N 4 N N 5 2 N N 6 N N 7 3 1

? ? ? ? ?層序遍歷是: 1 2 3 4 5 6 7 N N N N N N N N? ? ? ??

?????????????????二叉樹前序遍歷 :

????????根據(jù)邏輯,我們知道每個最小子樹,前序遍歷都是 左-根-右的方式遍歷的,那接下來我們來看看代碼:

void BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
//先打印當(dāng)前根節(jié)點
	printf("%d ", root->data);
//再向下往左找
	BinaryTreePrevOrder(root->left);
//再向下往右找
	BinaryTreePrevOrder(root->right);

}

? ? ? ? ? ? ? ? 二叉樹的中序遍歷:

void BinaryTreeInOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
//先從根節(jié)點往左找
	BinaryTreeInOrder(root->left);
//等左邊最小子樹找完了再打印
	printf("%d ", root->data);
//再往右找
	BinaryTreeInOrder(root->right);
}

? ? ? ? ? ? ? ? 二叉樹的后序遍歷:

void BinaryTreePostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
//先從根節(jié)點往左找
	BinaryTreePostOrder(root->left);
//再找向右找
	BinaryTreePostOrder(root->right);
//等右邊最小子樹找完了再打印
	printf("%d ", root->data);
}

????????????????二叉樹的層序遍歷:?

? ? ? ? 這個就比較困難了,其實也沒有什么很好的方法,不過一般人估計也不會想到,大偉這里就直接給大家答案吧:我們需要借助隊列來實現(xiàn)二叉樹的層序遍歷,那么思路是什么樣子的呢?

?????????其實我們實現(xiàn)層序就是要借助隊列的性質(zhì):后進先出,我們就先把根節(jié)點放進隊列,然后放根的左節(jié)點,再放右節(jié)點,將根打印出來后出隊列,將隊頭出隊列,將根改為隊列的的頭,再進當(dāng)前隊頭的左右節(jié)點,依次循環(huán),直到隊列為空。代碼簡單(這里就不給隊列的一系列的操作了,忘記的,或者想去復(fù)習(xí)復(fù)習(xí)的鐵汁們點這里 :-> 隊列)

void LevelOrder(BTNode* root)
{
	Queue q;
	if (root == NULL)
		return;
//隊列初始化
	QueueInit(&q);
//入隊列
	QueuePush(&q, root);
//若隊列不為空
	while (!QueueEmpty(&q))
	{
		printf("%d\n", QueueFront(&q)->val);

		BTNode* a = root->left;
		BTNode* b = root->right;
//出隊列的頭
		QueuePop(&q);
//若左不為空
		if (a)
			QueuePush(&q, a);
//若右不為空		
        if (b)
			QueuePush(&q, b);
//若不為空,則根改為當(dāng)前隊列的頭
		if (!QueueEmpty(&q))
			root = QueueFront(&q);

	}
}

? ? ? ? ? ? ? ? ?判斷二叉樹是不是完全二叉樹:

????????其實我們判斷二叉樹是不是完全二叉樹也有很多辦法,但是大偉這里講一種不是很常見的方法,但是是很容易理解的方法:那就是先假設(shè)二叉樹是一個完全二叉樹,然后通過最后一層所有孩子節(jié)點的下標(biāo)的索引來判斷,若有下標(biāo)索引超過實際二叉樹的總節(jié)點個數(shù),那么這個二叉樹就不是完全二叉樹了。代碼如下:

bool BinaryTreeComplete(BTNode* root, int index,int n) {
    //n為二叉樹的總節(jié)點個數(shù)
	// 如果當(dāng)前節(jié)點為空,直接返回 true
	if (root == NULL) {
		return true;
	}

	// 如果當(dāng)前節(jié)點的索引超過節(jié)點總數(shù),則返回 false
	if (index >= n) {
		return false;
	}

	// 遞歸檢查左子樹和右子樹
	return BinaryTreeComplete(root->left, 2 * index + 1,n) &&
		BinaryTreeComplete(root->right, 2 * index + 2,n);
}

? ? ? ? ? ? ? ? OK,到這里我們所有的二叉樹的基本操作就寫完了,那么接下來,來玩玩?

? ? ? ? test.c

????????

int main()
{
	BTNode* root = BTCreate();
//總節(jié)點個數(shù)
	int n = BinaryTreeSize(root);
    printf("%d\n", n)
//前序
	BinaryTreePrevOrder(root);
	printf("\n");
//中序
	BinaryTreeInOrder(root);
	printf("\n");
//后序
	BinaryTreePostOrder(root);
	printf("\n");
	
	if (BinaryTreeComplete(root, 0,n))
		printf("是完全二叉樹");
	else
		printf("不是完全二叉樹");
	return 0;
}

? ? ? ? 我們來看一看結(jié)果:你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹,你真的學(xué)懂了數(shù)據(jù)結(jié)構(gòu)?,數(shù)據(jù)結(jié)構(gòu),c語言,算法

? ? ? ? 是不是和我們想的一模一樣呢~ <(* ̄▽ ̄*)/?

? ? ? ? 其實大偉對遞歸部分的講解不是十分詳細,但是也是希望鐵汁們能好好理解,其實我們學(xué)到這里最重要的還是代碼的練習(xí)量,所以當(dāng)鐵汁們沒事做的時候,多刷刷題,多理解理解,O不O K?

?????????到這里本篇博客已經(jīng)可以是完結(jié)了,接著二叉樹后面就是排序了,在緊接著就進入c++啦,下篇文章我會對大家介紹數(shù)據(jù)結(jié)構(gòu)初階的最后一個內(nèi)容,請大家繼續(xù)支持大偉,謝啦!!☆⌒(*^-゜)v?

????????·你要做一個不動聲色的大人了。不準情緒化,不準偷偷想念,不準回頭看。去過自己另外的生活。你要聽話,不是所有的魚都會生活在同一片海里。---村上春樹

????????本篇博客也就到此為止了,送大家一碗雞湯,勉勵自己以及這世界上所有追逐夢想的赤子趁年華尚好努力提升自己,莫欺少年窮!?你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹,你真的學(xué)懂了數(shù)據(jù)結(jié)構(gòu)?,數(shù)據(jù)結(jié)構(gòu),c語言,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-856006.html

到了這里,關(guān)于你真的會數(shù)據(jù)結(jié)構(gòu)嗎:二叉樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)和算法】--- 二叉樹(3)--二叉樹鏈式結(jié)構(gòu)的實現(xiàn)(1)

    【數(shù)據(jù)結(jié)構(gòu)和算法】--- 二叉樹(3)--二叉樹鏈式結(jié)構(gòu)的實現(xiàn)(1)

    在學(xué)習(xí)二叉樹的基本操作前,需先要創(chuàng)建一棵二叉樹,然后才能學(xué)習(xí)其相關(guān)的基本操作。由于現(xiàn)在大家對二叉樹結(jié)構(gòu)掌握還不夠深入,且為了方便后面的介紹,此處手動快速創(chuàng)建一棵簡單的二叉樹,快速進入二叉樹操作學(xué)習(xí),等二叉樹結(jié)構(gòu)了解的差不多時,我們反過頭再來研

    2024年01月25日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹——順序結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹——順序結(jié)構(gòu)

    由于每個節(jié)點都 只有一個父節(jié)點 ,所以我們可通過雙親來表示一棵樹。具體方式通過 數(shù)組的形式 實現(xiàn)。 根節(jié)點的下標(biāo)為0 按照層序從上到下排序 每層從左向右遞增 表示形式: 二維數(shù)組 數(shù)據(jù)的列標(biāo)為0 ,只需確定行標(biāo),即可鎖定位置 根節(jié)點的父節(jié)點下標(biāo)為 -1 列標(biāo)為1存父節(jié)

    2024年02月02日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹——鏈式結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹——鏈式結(jié)構(gòu)

    目錄 ?一、前置聲明 二、二叉樹的遍歷 2.1?前序、中序以及后序遍歷 2.2?層序遍歷 三、節(jié)點個數(shù)以及高度 3.1?節(jié)點個數(shù) 3.2?葉子節(jié)點個數(shù) 3.3?第k層節(jié)點個數(shù) 3.4?二叉樹的高度/深度 3.5?查找值為x的節(jié)點 四、二叉樹的創(chuàng)建和銷毀 4.1?構(gòu)建二叉樹 4.2?二叉樹銷毀 4.3?判斷二叉樹

    2024年02月16日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)-二叉樹-二叉樹左右孩子交換(遞歸)

    ?注:本文采用隊列和遞歸的算法進行創(chuàng)建和層次遍歷。同時不能采用BFS和DFS,因為需要把當(dāng)前根節(jié)點的左孩、右孩勾鏈并輸入才能遞歸下一個根節(jié)點; 隊列用于存儲此時應(yīng)該遞歸的根節(jié)點; 格式:每一行尾不能有空格; Description 根據(jù)輸入利用二叉鏈表創(chuàng)建二叉樹,并將所

    2024年02月04日
    瀏覽(38)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹鏈式結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹鏈式結(jié)構(gòu)

    ??write in front?? ??所屬專欄:初階數(shù)據(jù)結(jié)構(gòu) ???博客主頁:睿睿的博客主頁 ???代碼倉庫:??VS2022_C語言倉庫 ??您的點贊、關(guān)注、收藏、評論,是對我最大的激勵和支持?。?! 關(guān)注我,關(guān)注我,關(guān)注我 , 你們將會看到更多的優(yōu)質(zhì)內(nèi)容?。???在之前的二叉樹的順序結(jié)

    2024年02月03日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的介紹和二叉樹堆

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的介紹和二叉樹堆

    ??作者簡介: 加油,旭杏,目前大二,正在學(xué)習(xí) C++ , 數(shù)據(jù)結(jié)構(gòu) 等?? ??作者主頁:加油,旭杏的主頁?? ?本文收錄在:再識C進階的專欄?? ??代碼倉庫:旭日東升 1?? ??歡迎大家點贊 ?? 收藏 ? 加關(guān)注哦!?? ???????樹這一概念,在我們剛開始聽說的時候會覺得

    2024年01月20日
    瀏覽(34)
  • 【數(shù)據(jù)結(jié)構(gòu)】 二叉樹理論概念!一文了解二叉樹!

    【數(shù)據(jù)結(jié)構(gòu)】 二叉樹理論概念!一文了解二叉樹!

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : 數(shù)據(jù)結(jié)構(gòu)解析 ?? 莫道桑榆晚,為霞尚滿天! 什么是二叉樹?二叉樹的組成構(gòu)造是什么樣的?我們將由淺入深,循序漸進的方式把二叉樹給搞明白,讓你徹底了解二叉樹! 樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n=0)個有限結(jié)點組成一

    2024年02月05日
    瀏覽(52)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹和平衡二叉樹

    1、二叉樹: 2、平衡二叉樹:

    2024年04月17日
    瀏覽(37)
  • 深入理解數(shù)據(jù)結(jié)構(gòu)第三彈——二叉樹(3)——二叉樹的基本結(jié)構(gòu)與操作

    深入理解數(shù)據(jù)結(jié)構(gòu)第三彈——二叉樹(3)——二叉樹的基本結(jié)構(gòu)與操作

    二叉樹(1): 深入理解數(shù)據(jù)結(jié)構(gòu)第一彈——二叉樹(1)——堆-CSDN博客 二叉樹(2): 深入理解數(shù)據(jù)結(jié)構(gòu)第二彈——二叉樹(2)——堆排序及其時間復(fù)雜度-CSDN博客 前言: 在前面我們講了堆及其應(yīng)用,幫助我們初步了解了二叉樹的一些原理,但那與真正的二叉樹仍有不同,

    2024年04月09日
    瀏覽(32)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹、二叉樹的概念和二叉樹的順序結(jié)構(gòu)及實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】樹、二叉樹的概念和二叉樹的順序結(jié)構(gòu)及實現(xiàn)

    之前我們學(xué)習(xí)了順序表、鏈表以及棧和隊列這些數(shù)據(jù)結(jié)構(gòu),但這些數(shù)據(jù)結(jié)構(gòu)都是線性的(一對一)。接下來要學(xué)習(xí) 非線性的數(shù)據(jù)結(jié)構(gòu)——樹(二叉樹) ,相比前面的,樹的結(jié)構(gòu)更加復(fù)雜,話不多說,直接進入正題吧。 樹是一種 非線性的數(shù)據(jù)結(jié)構(gòu) ,它是 一對多(也有可能是

    2024年02月07日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包