栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

学习c语言的第二十八天

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习c语言的第二十八天

 二叉树的建立以及前中后序遍历:

输入:二叉树的结构体变量为BiTree T,其成员是int data(data用来存储二叉树的结点的值),以及 struct Tree *lchild(指针指向二叉树的左孩子), struct Tree *rchild;(指针指向二叉树的右孩子)。

输出:按照前中后序遍历树T,输出遍历结果。

优化目标:可能没有优化目标。

#include
#include
typedef struct Tree{
	int data;
	struct Tree *lchild;
	struct Tree *rchild;
}Tree,*BiTree; 

BiTree CreateTree(){
	int n;
	BiTree t;
	printf("根结点为:");
	scanf("%d",&n);
	if(n==-1){
		return NULL;
	} {
		t=(BiTree)malloc(sizeof(Tree));
		t->data=n;
		printf("输入%d左子树",n);
		t->lchild= CreateTree();
		printf("输入%d右子树",n);
		t->rchild= CreateTree();
		return t;
	}
}

void Preorder(BiTree T){
	if(T==NULL){
		return NULL;
	} 
	printf("%d",T->data);
	Preorder(T->lchild);
	Preorder(T->rchild);
}

void Inorder(BiTree T){
	if(T==NULL){
		return NULL;
	} 
	Inorder(T->lchild);
	printf("%d",T->data);
	Inorder(T->rchild);
}

void Postorder(BiTree T){
	if(T==NULL){
		return NULL;
	} 
	Postorder(T->lchild);
	Postorder(T->rchild);
	printf("%d",T->data);
}

int main(){ 
    BiTree T=CreateTree();
    printf("前序为:");
	Preorder(T);
	printf("n"); 
	printf("中序为:");
    Inorder(T); 
    printf("n"); 
    printf("后序为:");
	Postorder(T);
	
} 

 二叉树的叶子结点数以及树的高度:

输入:二叉树的结构体变量为BiTree T,其成员是int data(data用来存储二叉树的结点的值),以及 struct Tree *lchild(指针指向二叉树的左孩子), struct Tree *rchild;(指针指向二叉树的右孩子)。

输出:树的叶子结点数num以及树的高度high。

优化目标:可能没有优化目标。
 

#include
#include
typedef struct Tree{
	int data;
	struct Tree *lchild;
	struct Tree *rchild;
}Tree,*BiTree; 

BiTree CreateTree(){
	int n;
	BiTree t;
	printf("根结点为:");
	scanf("%d",&n);
	if(n==-1){
		return NULL;
	} {
		t=(BiTree)malloc(sizeof(Tree));
		t->data=n;
		printf("输入%d左子树",n);
		t->lchild= CreateTree();
		printf("输入%d右子树",n);
		t->rchild= CreateTree();
		return t;
	}
}

int Depth(BiTree T){
	if(T==NULL){
		return 0;
	}else{
		int m=Depth(T->lchild);
		int n=Depth(T->rchild); 
		if(m>=n){
			return (m+1);
		}else return (n+1);
	}
}
int Totalnum(BiTree T){
	if(T==NULL){
		return 0;
	}else{
		return (Totalnum(T->lchild)+Totalnum(T->rchild)+1);
	}
}
	
int main(){
		BiTree T=CreateTree();
		int high;
		high=Depth(T); 
		printf("树的高度为%d",high);
		int num;
		num=Totalnum(T); 
		printf("该树共有%d个结点",num);
} 

 

输出链表中的奇数结点。

输入:链表各个结点的值num。

输出:全为奇数的链表的值。

优化目标:昨天的练习中是把链表直接分成了全为奇数的链表和全为偶数的链表,空间复杂度过高,现在第二版直接在链表中删除偶数结点来达到效果,如果只需要输出正确,第三版也可以直接筛选奇数输出。

第一版:

#include
#include
typedef struct LNode *list;
struct LNode{
	int data;
	list next;	
}; 
 
void print(list l){//输出操作 
	if(l==NULL){
		printf("NULL");
	}
	while(l!=NULL){
		printf("%d ",l->data);
		l=l->next;
	}
}
 

int ji(list l){
	list l1;
	l1->next=NULL;
	list l2=l1;
	while(l!=NULL){
	    if(l->data%2!=0){
	    	list q=(list)malloc(sizeof(struct LNode));
	    	q->next=NULL;
		    q->data=l->data;
		    l1->next=q;
		    l1=q;
		}
		l=l->next;
	}
	return l2;
}
 
int main(){
    int num;
    list l;
    list l1=l;
    l->next=NULL;
	scanf("%d",&num);
	while(num!=-1){
		list q=(list)malloc(sizeof(struct LNode));
		q->next=NULL;
		q->data=num;
		l->next=q;
		l=q;
		scanf("%d",&num);
	}
	
	list l2=l1;
	l1=l1->next;	
	print(l1);
	printf("n");
	list l3=ji(l1);
	list la=l3->next;
	printf("奇数结点:");
	print(la);

}

第二版: 

#include
#include
typedef struct LNode *list;
struct LNode{
	int data;
	list next;	
}; 
 
void print(list l){
	if(l==NULL){
		printf("NULL");
	}
	while(l!=NULL){
		printf("%d ",l->data);
		l=l->next;
	}
}
 


int main(){
    int num;
    list l;
    list l1=l;
    l->next=NULL;
	scanf("%d",&num);
	while(num!=-1){
		list q=(list)malloc(sizeof(struct LNode));
		q->next=NULL;
		q->data=num;
		l->next=q;
		l=q;
		scanf("%d",&num);
	}
	list l2=l1;
	l1=l1->next;
	printf("结点:");	
	print(l1);
	printf("n");
    if(l2->next==NULL){
	 	return NULL;
	}
	list p=l2;
    list q=l2;
    l2=l2->next;
    while(l2!=NULL){
    	if(l2->data%2==0){
    		q->next=l2->next;
    		l2=q->next;
		}else{
			q=q->next;
    		l2=l2->next;
		}
	}
	p=p->next;
	printf("奇数结点:");
	print(p);
}

第三版:

#include
#include
typedef struct LNode *list;
struct LNode{
	int data;
	list next;	
}; 
 
void print(list l){
	if(l==NULL){
		printf("NULL");
	}
	while(l!=NULL){
		printf("%d ",l->data);
		l=l->next;
	}
}
 


int main(){
    int num;
    list l;
    list l1=l;
    l->next=NULL;
	scanf("%d",&num);
	while(num!=-1){
		list q=(list)malloc(sizeof(struct LNode));
		q->next=NULL;
		q->data=num;
		l->next=q;
		l=q;
		scanf("%d",&num);
	}
	l1=l1->next;
	printf("结点:");	
	print(l1);
	printf("n");
	printf("奇数结点:");
	while(l1!=NULL){
		if(l1->data%2!=0){
			printf("%d ",l1->data);
			l1=l1->next;
		}else{
			l1=l1->next;
		}
	}
}

今天复习了二叉树的基本操作和链表的知识,代码还是要多复习才能熟悉!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号