数据结构第六章树和二叉树

树的同构

试题描述
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。

输入
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。
输出
如果两棵树是同构的,输出“Yes”,否则输出“No”。
样例输入
8
A 1 2
B 3 4
C 5 -
D - -
E 6 -
G 7 -
F - -
H - -
8
G - 4
B 7 6
F - -
A 5 1
H - -
C 0 -
D - -
E 2 -

样例输出
Yes

#include<stdio.h>
#include<stdlib.h>
#define Null -1 
struct TreeNode{
	char Element;
	int Left;
	int Right;
}T1[10],T2[10];
int n;
int check[10];

int BuildTree(struct TreeNode T[])
{
	int Root=Null;
	int i;
	char cl,cr;
	scanf("%d\n",&n);

	for(i=0;i<n;i++) check[i]=0;
	for(i=0;i<n;i++)
	{
		scanf("%c %c %c\n",&T[i].Element,&cl,&cr);
		if(cl!='-'){
			T[i].Left=cl-'0';
			check[T[i].Left]=1;
		}
		else T[i].Left=Null;
		if(cr!='-'){
			T[i].Right=cr-'0';
			check[T[i].Right]=1;
		}
		else T[i].Right=Null;
	}
	for(i=0;i<n;i++)
	  if(!check[i]) break;
	  Root=i;
	  return Root;
}

int isomerphic(int R1,int R2) 
{
	if((R1==-1)&&(R2==-1)) return 1;
	if(((R1==-1)&&(R2!=-1))||((R1!=-1)&&(R2==-1))) return 0;
	if(T1[R1].Element!=T2[R2].Element) return 0;
	if((T1[R1].Left==-1)&&(T2[R2].Left==-1))
	return isomerphic(T1[R1].Right,T2[R2].Right);
	if(((T1[R1].Left!=-1)&&(T2[R2].Left!=-1))&&((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element)))
	return (isomerphic(T1[R1].Left,T2[R2].Left)&&isomerphic(T1[R1].Right,T2[R2].Right));
	else 
	return (isomerphic(T1[R1].Left,T2[R2].Right)&&isomerphic(T1[R1].Right,T2[R2].Left));
}

int main()
{
	int R1,R2;
	R1=BuildTree(T1);
	R2=BuildTree(T2);
	if(isomerphic(R1,R2)) printf("Yes\n");
	else printf("No\n");
	return 0;
}


试题描述
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.
输入
Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree – and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a “-” will be put at the position. Any pair of children are separated by a space.
输出
For each test case, print in one line all the leaves" indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.
样例输入
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

样例输出
4 1 5

#include <stdio.h>
#include <stdlib.h>
#define MaxTree 10
#define Tree int
#define ElementType int
#define Null -1

//
struct TreeNode {
	Tree Left;
	Tree Right;
}T[MaxTree];

//
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
	ElementType *Data;
	Position Front;
	Position Rear;
	int MaxSize;
}; 
typedef PtrToQNode Queue;

Tree BuildTree(struct TreeNode T[], int N);  //
void LeaveSearch(Tree R, int N);//
Queue CreateQueue(int MaxSize);//
int IsEmpty(Queue Q);//
void AddQ(Queue Q, ElementType X);//
ElementType DeleteQ(Queue Q);//

//
int main()
{
	Tree R;//
	int N;
	scanf("%d\n",&N);
	R = BuildTree(T, N); //
	LeaveSearch(R, N);//
	 
	return 0;
 } 
 
Tree BuildTree(struct TreeNode T[], int N)
{
	int i; //??‘????±???°
	Tree Root;
	char cl, cr;
	int check[10] = {0,};
	if (!N) Root = Null;
	if (N){ //??‘????o 
		for (i=0; i<N; i++) check[i] = 0;
		for (i=0; i<N; i++){
			scanf("%c %c\n",&cl, &cr);
			if (cl != '-'){
				T[i].Left = cl-'0';
				check[T[i].Left ] = 1;
			}else T[i].Left = Null;
			if (cr != '-'){
				T[i].Right = cr-'0';
				check[T[i].Right ] = 1;
			}else T[i].Right = Null;
		}
		for (i=0; i<N; i++) if (!check[i]) break;
		Root = i;
	}
	return Root; //
}

//
void LeaveSearch(Tree R, int N)//
/**/ 
{
	/*******************************
	
	********************************/
	Queue Q;
	Tree R_1;
	int flag = 1;
	int cnt = 0;
	Q = CreateQueue(MaxTree);
	if (R == Null) printf("0");
	if (T[R].Left == Null && T[R].Right == Null)
		printf("%d",R);
	AddQ(Q, R);//?°???1è????1R??’?…¥é????—
	while (!IsEmpty(Q)){
		R_1 = DeleteQ(Q);
		if ((++cnt) == N) flag = 0;
		if (T[R_1].Left == Null && T[R_1].Right == Null){
			printf("%d",R_1);
			if (flag) printf(" "); 
		}
		if (T[R_1].Left != Null) AddQ(Q, T[R_1].Left );
		if (T[R_1].Right != Null) AddQ(Q, T[R_1].Right );
	} 	
}

Queue CreateQueue(int MaxSize)
{
	Queue Q = (Queue)malloc(sizeof(struct QNode));
	Q->Data = (ElementType*)malloc(MaxSize * sizeof(ElementType));
	Q->Front = Q->Rear = 0;
	Q->MaxSize = MaxSize;
	
	return Q;
 } 
 
int IsEmpty(Queue Q)
{
	if (Q->Front == Q->Rear) return 1;
	else return 0;
 } 
 
 void AddQ(Queue Q, ElementType X)
{
	Q->Rear = (Q->Rear+1) % Q->MaxSize ;
	Q->Data[Q->Rear ] = X;
 } 
 
ElementType DeleteQ(Queue Q)
{
	Q->Front = (Q->Front+1)% Q->MaxSize ;
	return Q->Data[Q->Front ];
 }


是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。

简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
样例输入
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

样例输出
Yes
No
No

#include<stdio.h>
#include<stdlib.h>
typedef struct binaryTree* BST;
struct binaryTree{
	int data;
	BST left;
	BST right;
};
BST Insert(BST T,int X)
{
	if(T==NULL)
	{
		T=(struct binaryTree*)malloc(sizeof(struct binaryTree));
		T->data=X;
		T->left=T->right=NULL;
	}
	else{
		if(T->data>X)
		{
			T->left=Insert(T->left,X);
		}
		else if(T->data<X)
		{
			T->right=Insert(T->right,X);
		}
	}
	return T;
}
int cmp(BST T1,BST T2)
{
	if(T1==NULL&&T2==NULL)
	return 1;
	if(T1&&T2)
		if(T1->data==T2->data)
			if(cmp(T1->left,T2->left)&&cmp(T1->right,T2->right))
			return 1;
		return 0;
}
int main(){
	BST T;T=NULL;BST T2;
	int N,L;int i;
	while(scanf("%d",&N)!=EOF)
	{
		if(N==0)return 0;
		scanf("%d",&L);
		T=NULL;
		int temp;
	for(i=0;i<N;i++)
	{
		scanf("%d",&temp);
		T=Insert(T,temp);
	}
	while(L--)
	{
		int temp2;T2=NULL;
		for(i=0;i<N;i++)
		{
			scanf("%d",&temp2);
			T2=Insert(T2,temp2);
		}
		if(cmp(T,T2))printf("Yes\n");
		else 	  printf("No\n");
		
	}
	}
	
}


Root of AVL Tree

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

输入
Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
输出
For each test case, print the root of the resulting AVL tree in one line.
样例输入
5
88 70 61 96 120

样例输出
70

#include <stdio.h>  
#include <stdlib.h>  
  
typedef struct AVLNode *AVLTree;  
typedef struct AVLNode *Position;  
struct AVLNode {  
    int Data;  
    int Height;  
    AVLTree Left;  
    AVLTree Right;  
};  
  
AVLTree Insert(int X, AVLTree T);  
int GetHeight(Position T);  
int Max(int a, int b);  
Position SingleLeft(Position K);  
Position SingleRight(Position K);  
Position DoubleLeft(Position K);  
Position DoubleRight(Position K);  
  
int main(void) {  
    AVLTree T = NULL;  
    int n;  
    scanf("%d", &n);  
    while (n--) {  
        int x;  
        scanf("%d", &x);  
        T=Insert(x, T);  
    }  
    if (T)  
        printf("%d", T->Data);  
    return 0;  
}  
  
AVLTree Insert(int X, AVLTree T) {  
    if (T == NULL) {  
        T = (AVLTree)malloc(sizeof(struct AVLNode));  
        T->Data = X;  
        T->Height = 0;  
        T->Left = T->Right = NULL;  
    }  
    else if (X < T->Data) {  
        T->Left = Insert(X, T->Left);  
        if (GetHeight(T->Left) - GetHeight(T->Right) == 2) {  
            if (X < T->Left->Data)  
                T = SingleLeft(T);  
            else  
                T = DoubleLeft(T);  
        }  
    }  
    else if (X > T->Data) {  
        T->Right = Insert(X, T->Right);  
        if (GetHeight(T->Right) - GetHeight(T->Left) == 2) {  
            if (X > T->Right->Data)  
                T = SingleRight(T);  
            else  
                T = DoubleRight(T);  
        }  
    }  
    T->Height = Max(GetHeight(T->Left), GetHeight(T->Right)) + 1;  
    return T;  
}  
  
int GetHeight(Position T) {  
    if (!T)  
        return -1;  
    else  
        return T->Height;  
}  
  
int Max(int a, int b) {  
    return (a > b) ? a : b;  
}  
  
Position SingleLeft(Position K) {  
    Position Tmp;  
    Tmp = K;  
    K = K->Left;  
    Tmp->Left = K->Right;  
    K->Right = Tmp;  
    Tmp->Height = Max(GetHeight(Tmp->Left), GetHeight(Tmp->Right)) + 1;  
    K->Height = Max(GetHeight(K->Left), GetHeight(K->Right)) + 1;  
    return K;  
}  
  
Position SingleRight(Position K) {  
    Position Tmp;  
    Tmp = K;  
    K = K->Right;  
    Tmp->Right = K->Left;  
    K->Left = Tmp;  
    Tmp->Height = Max(GetHeight(Tmp->Left), GetHeight(Tmp->Right)) + 1;  
    K->Height = Max(GetHeight(K->Left), GetHeight(K->Right)) + 1;  
    return K;  
}  
  
Position DoubleLeft(Position K) {  
    K->Left = SingleRight(K->Left);   
    return SingleLeft(K);  
}  
  
Position DoubleRight(Position K) {  
    K->Right = SingleLeft(K->Right);  
    return SingleRight(K);  
}


第八章 查找

电话聊天狂人

试题描述
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。
输入
输入首先给出正整数N(≤10​5 ),为通话记录条数。随后N行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。
输出
在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,并且附加给出并列狂人的人数。
样例输入
4
13005711862 13588625832
13505711862 13088625832
13588625832 18087925832
15005713862 13588625832

样例输出
13588625832 3

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAXD 1000000

#define MAXNUMBER 12


typedef struct list
{
    int count;
    char telenumber[MAXNUMBER];
    struct list *Next;
} *LNode;


typedef struct Map
{
    int size;
    LNode Head;
} *HashMap;


int NewPrime(int numbers)
{
    int i,j,temp;
    for(i=numbers+1;i<MAXD;i+=2)
    {
        temp = sqrt(i);
        for(j=2;j<=temp;j++)
            if(i%j == 0)
                break;
        if(j == temp + 1)
            return i;
    }
}


int Hash(char *key,int p)
{
    return (atoi(key+MAXNUMBER-5) % p);
}


LNode Find(HashMap H,char* str)
{
    int pos = Hash(str,H->size);
    LNode position = H->Head[pos].Next;
    while(position)
    {
        if(!strcmp(str,position->telenumber))
            break;
        else
            position = position->Next;
    }
    return position;
}


void Insert(char* str,HashMap H)
{
    int pos;
    LNode position;
    position = Find(H,str);
    if(!position)
    {
        position = (LNode)malloc(sizeof(struct list));
        pos = Hash(str,H->size);
        strcpy(position->telenumber,str);
        if(position->telenumber)
        {
            position->count = 1;
            position->Next = H->Head[pos].Next;
            H->Head[pos].Next = position; 
        }
    }
    else
        position->count++;
    return;
}


HashMap CreateHashMap(int numbers)
{
    int i;
    HashMap H;
    char str[MAXNUMBER];
    H = (HashMap)malloc(sizeof(struct Map));
    H->size = NewPrime(2*numbers);
    H->Head = (LNode)malloc(H->size *sizeof(struct list));
    for(i=0;i<H->size;i++)
    {
        H->Head[i].Next = NULL;
        H->Head[i].count = 0;
        H->Head[i].telenumber[0] ='\0'; 
    }
    for(i=0;i<2*numbers;i++)
    {
        scanf("%s",&str);
        Insert(str,H);
    }
    return H;
}


void Print(HashMap H)
{
    LNode position;
    int i,maxcount = 0,friends = 0;
    char minnumber[MAXNUMBER];
    for(i=0;i < H->size;i++)
    {
        position = H->Head[i].Next;
        while(position)
        {
            if(position->count > maxcount)
            {
                maxcount = position->count;
                strcpy(minnumber,position->telenumber);
                friends = 1;
            }
            else if(position->count == maxcount)
            {
                friends++;
                if(strcmp(position->telenumber,minnumber)<0)
                    strcpy(minnumber,position->telenumber);
            }
            position = position->Next;
        }
    }
    printf("%s %d",minnumber,maxcount);
    if(friends>1)
    printf(" %d",friends);
    return;
}


int main()
{
    HashMap H;
    int numbers,test;
    char str[MAXNUMBER];
    scanf("%d",&numbers);
    H = CreateHashMap(numbers);
    Print(H);
    return 0;
}


hashing

试题描述
The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers. The hash function is defined to be H(key)=key%TSize where TSize is the maximum size of the hash table. Quadratic probing (with positive increments only) is used to solve the collisions.

Note that the table size is better to be prime. If the maximum size given by the user is not prime, you must re-define the table size to be the smallest prime number which is larger than the size given by the user.
输入
Each input file contains one test case. For each case, the first line contains two positive numbers: MSize (≤104 ) and N (≤MSize) which are the user-defined table size and the number of input numbers, respectively. Then N distinct positive integers are given in the next line. All the numbers in a line are separated by a space.
输出
For each test case, print the corresponding positions (index starts from 0) of the input numbers in one line. All the numbers in a line are separated by a space, and there must be no extra space at the end of the line. In case it is impossible to insert the number, print “-” instead.
样例输入
4 4
10 6 4 15

样例输出
0 1 4 -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10000
typedef struct HTable *HashTable;
struct HTable {
	int *list;
	int size;
};
HashTable CreatTable(int n);
int Insert(HashTable H, int num);
int NextPrime(int n);
 
int main() {
	int i, m, n, num;
	int pos[N];
	HashTable H;
	scanf("%d%d", &m, &n);
	H = CreatTable(m);
	for (i = 0; i < n; i++) {
		scanf("%d", &num);
		pos[i] = Insert(H, num);
	}
	if (n) {
		printf("%d", pos[0]);
		for (i = 1; i < n; i++) {
			if (pos[i] == -1) printf(" -");
			else printf(" %d", pos[i]);
		}
	}
	return 0;
}
 
HashTable CreatTable(int n) {
	HashTable H;
	int i;
	H = (HashTable)malloc(sizeof(struct HTable));
	H->size = NextPrime(n);
	H->list = (int*)malloc(H->size*sizeof(int));
	for (i = 0; i < H->size; i++)
		H->list[i] = 0;
	return H;
}
 
 
 
int Insert(HashTable H, int num) {
	int pos, i;
	pos = num % H->size;
	for (i = 0; i <= H->size/2 && H->list[pos]; i++) //?ï¿ ?é?? <= size/2
		pos = (pos + 2 * i + 1) % H->size;	
	if (i <= H->size/2) {
		H->list[pos] = 1;
		return pos;
	}
	else return -1;
}
 
int NextPrime(int n) {
	int i, j;
	if (n == 1 || n % 2 == 0) //1?????ˉ?′???°
		n++;
	for (i = n;; i += 2) {
		for (j = 3; j*j <= i && i%j; j++);
		if (j*j > i) break;
	}
	return i;
}


1. 一二叉树的顺序存储情况如下: ,度为2的结点数为( )。 A.1 B.2 C.3 D.4 2. 一“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 3.下列说法,( )是正确的。 A. 二叉树就是度为2的 B. 二叉树不存在度大于2的结点 C. 二叉树是有序 D. 二叉树每个结点的度均为2 4.一二叉树的前序遍历序列为ABCDEFG,它的序遍历序列可能是( )。 A. CABDEFG B. BCDAEFG C. DACEFBG D. ADBCFEG 5.线索二叉树的线索指的是( )。 A.左孩子 B.遍历 C.指针 D.标志 6. 建立线索二叉树的目的是( )。 A. 方便查找某结点的前驱或后继 B. 方便二叉树的插入与删除 C. 方便查找某结点的双亲 D. 使二叉树的遍历结果唯一 7. 有abc三个结点的右单枝二叉树的顺序存储结构应该用( )示意。 A. a b c B. a b ^ c C. a b ^ ^ c D. a ^ b ^ ^ ^ c 8. 一颗有2046个结点的完全二叉树的第10层上共有( )个结点。 A. 511 B. 512 C. 1023 D. 1024 9. 一完全二叉树一定是一( )。 A. 平衡二叉树 B. 二叉排序 C. 堆 D. 哈夫曼 10.某二叉树序遍历序列和后序遍历序列正好相反,则该二叉树一定是( )的二叉树。 A.空或只有一个结点 B.高度等于其结点数 C.任一结点无左孩子 D.任一结点无右孩子 11.一二叉树的顺序存储情况如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A B C D E 0 F 0 0 G H 0 0 0 X 结点D的左孩子结点为( )。 A.E B.C C.F D.没有 12.一“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 二、填空题(每空3分,共18分)。 1. 的路径长度:是从根到每个结点的路径长度之和。对结点数相同的来说,路径长度最短的是 完全 二叉树。 2. 在有n个叶子结点的哈夫曼,总结点数是 2n-1 。 3. 在有n个结点的二叉链表,值为非空的链域的个数为 n-1 。 4. 某二叉树序遍历序列和后序遍历序列正好相反,则该二叉树一定是 任一结点无左孩子 的二叉树。 5. 深度为 k 的二叉树最多有 个结点,最少有 k 个结点。 三、综合题(共58分)。 1. 假定字符集{a,b,c,d,e,f }的字符在电码出现的次数如下: 字符 a b c d e f 频度 9 12 20 23 15 5 构造一哈夫曼(6分),给出每个字符的哈夫曼编码(4分),并计算哈夫曼的加权路径长度WPL(2分)。 (符合WPL最小的均为哈夫曼,答案不唯一) 哈夫曼编码: 2. 假设用于通信的电文由字符集{a,b,c,d,e,f,g}的字符构成,它们在电文出现的频率分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。要求: (1)为这7个字符设计哈夫曼(6分)。 (2)据此哈夫曼设计哈夫曼编码(4分)。 (3)假设电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少?(4分) (1) 为这7个字符设计哈夫曼为(符合WPL最小的均为哈夫曼,答案不唯一): (2) 哈夫曼编码为: a:01;b:001;c:100;d:0001;e:101;f:11;g:0000 (3) 假设电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少? 采用等长码,100个字符需要300位二进制数,采用哈夫曼编码发送这100个字符需要261二进制位,压缩了300-261=39个字符。压缩比为39/300=13%。 3. 二叉数T的(双亲到孩子的)边集为: { <A,B>, <A,C>, <D,A>, <D,E>, <E,F>, <F,G> } 请回答下列问题: (1)T的根结点(2分): (2)T的叶结点(2分): (3)T的深度(2分): (4)如果上述列出边集,某个结点只有一个孩子时,均为其左孩子;某个结点有两个孩子时,则先列出了连接左孩子的边后列出了连接右孩子的边。画出该二叉树其及前序线索(6分)。 (1)T的根结点 (2)T的叶结点 : (3)T的深度 : (4)该二叉树其及前序线索为: 4.现有以下按前序和序遍历二叉树的结果: 前序:ABCEDFGHI 序:CEBGFHDAI 画出该二叉树的逻辑结构图(5分),并在图加入序线索(5分)。 5.有电文:ABCDBCDCBDDBACBCCFCDBBBEBB。 用Huffman构造电文每一字符的最优通讯编码。画出构造的哈夫曼,并给出每个字符的哈夫曼编码方案。(符合WPL最小的均为哈夫曼,答案不唯一) (1)构造哈夫曼(6分): (2)哈夫曼编码方案(4分):
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值