学习c语言的第十一天

今天打算学习二叉树的一些知识,但是在学习的过程中也发现这一部分的内容包含了很多关于栈和队列的操作,所以我先回顾了一遍关于栈以及队列的一些基本操作。

输入:栈的结构体变量为stack s,其成员是  elemtype data[maxsize](栈的元素值以及最大存储量maxsize)以及 elemtype top(栈顶指针)。

输出:无输出。

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

栈的建立,插入,删除,判断栈是否为空,清空栈,取栈顶值,求栈的元素个数代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxsize 20
typedef int elemtype; 
typedef struct{
	 elemtype data[maxsize];
	 elemtype top;
}stack;
bool initstack(stack *s){//初始化栈,将栈顶指针指向-1
	s->top=-1;
	return true;
}
void visit (elemtype c){
	printf("%d",c);
}
bool empty(stack s){//若栈顶指针为-1则栈为空 
	if(s.top==-1){
		return true;
	}else {
		return false;
	}
} 
bool clear(stack *s){//清空栈 
	s->top=-1;
	return true;
} 
bool gettop(stack s,elemtype *e) {
	if (s.top==-1){
		return false;
	} else {
		*e=s.data[s.top];
	}
}
elemtype length(stack s){
	return s.top+1;//求栈的元素个数 
} 
bool push(stack *s,elemtype e){
	if(s->top==maxsize-1){
		return false;//栈满,不能再入栈。 
	}else{
	s->top++;
	s->data[s->top]=e;//新插入的元素入栈
	 
	return true;
    }   
}
bool pop(stack *s,elemtype *e){
	if(s->top==-1){
		return false;
	}else {
		*e=s->data[s->top];
		s->top--;
		return true; 
	}
} 
int main(){
	stack s;
	int e;
	push (&s,e);
}

 二叉树的三种遍历方法

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

输出:前中后遍历的结果。

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

#include<stdio.h>
#include<stdlib.h>
typedef struct Tree{
	int data;
	struct Tree *lchild;
	struct Tree *rchild;
}Tree,*BiTree; 
 
BiTree CreateTree(){//建一棵树 
	int num;
	BiTree T;
	scanf("%d",&num);
	if(num==-1){
		return NULL;
	}else{
		T=(BiTree)malloc(sizeof(Tree));
		T->data=num;
		printf("请输入%d的左子树",num);
		T->lchild=CreateTree();
		printf("请输入%d的右子树",num);
		T->rchild=CreateTree();	
		return T;	
	}
}
void Preorder(BiTree T){
	if(T==NULL){
		return ;
	} 
	printf("%d",T->data);
	Preorder(T->lchild);
	Preorder(T->rchild);//先序遍历	
}
void Inorder(BiTree T){
	if(T==NULL){
		return ;
	} 
	Inorder(T->lchild);
	printf("%d",T->data);
	Inorder(T->rchild);//中序遍历
}
void Postorder(BiTree T){
	if(T==NULL){
		return ;
	} 
	Postorder(T->lchild);
	Postorder(T->rchild);
	printf("%d",T->data);//后序遍历	
}


int main(){
	BiTree T=CreateTree();
	Preorder(T);
	Inorder(T);
	Postorder(T);
	} 

求二叉树高度 

本题要求给定二叉树的高度。

输入:二叉树的结构体变量为BinTree T,其成员是ElementType Data(Data用来存储二叉树的结点的值),以及BinTree Left;(指针指向二叉树的左孩子),BinTree Left;(指针指向二叉树的右孩子)。

输出:二叉树的高度。

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

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

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); 
int GetHeight( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("%d\n", GetHeight(BT));
    return 0;
}
int GetHeight( BinTree BT )
{
	int high;
	if(BT == NULL){
		return 0;
	}
	high = GetHeight(BT->Left) >  GetHeight(BT->Right) ? GetHeight(BT->Left)+1:GetHeight(BT->Right)+1;
	return high;
}

今天我看了很多关于二叉树的知识,回顾了很多关于遍历的知识,有涉及到一些关于非递归的遍历,栈的特点是先进先出,这一点也能很好地用于非递归的遍历,比如说在前序遍历中,可以利用这一特点,先读出结点的值,把该结点放入栈内,然后去找该结点的左孩子,如果说左结点不存在,那就可以从栈中读出结点,转而去找该结点的右孩子,这个概念点看起来只有几句话但是如果要是自己拿起笔演算一遍就会发现真的是一种很巧妙的方法,今天复习了很多之前学习的知识点,以及遍历,明天会继续复习一些自己会觉得有些遗忘的代码,并且继续二叉树的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值