11月16日算法作业

1、 完全二叉树的栈删除

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

struct TNODE{
	int value;
	TNODE *leftPointer;
	TNODE *rightPointer;
};

//队列用的节点 
struct QNODE{
	TNODE *value;
	QNODE *pNext;
};

//树的根节点指针 
TNODE *root = NULL; 

//队列的头和尾部 
QNODE *head = NULL;
QNODE *tail = NULL; 
QNODE *head1 = NULL;
QNODE *tail1 = NULL; 
void addToQueue(TNODE* node){
	QNODE *qNode = (QNODE*)malloc(sizeof(QNODE));
	qNode->value = node;
	qNode->pNext = NULL;
	 
	if (head == NULL){
		head = qNode;
		tail = qNode;	
	}else{
		tail->pNext = qNode;
		tail = qNode;
	}
}
void addToStack(TNODE* node){
	QNODE *qNode = (QNODE*)malloc(sizeof(QNODE));
	qNode->value = node;
	qNode->pNext = NULL;
	 
	if (head1 == NULL){
		head1 = qNode;
		tail1 = qNode;	
	}else{
		qNode->pNext=head1;
		head1=qNode;
	}
}

void displayAllDataInQueue(){
	QNODE* p = head;
	while(p != NULL){
		TNODE* node = p->value;
		
		printf("%d\n", node->value);
		
		p = p->pNext;
	}
}

//从队列头部弹出一个节点 
QNODE* queuePop(){	
	QNODE* headNODE = head;
	head = head->pNext;
	if (head == NULL){
		tail = NULL;
	}
	
	return headNODE;
}
//栈弹出
QNODE* stackPop(){	
	QNODE* headNODE = head1;
	head1 = head1->pNext;
	if (head1 == NULL){
		tail1 = NULL;
	}
	
	return headNODE;
} 
void displayAllDataInTree(){
	if (root == NULL)
		return;	
	
	head = NULL;
	tail = NULL;	
		
	//把root加到队列
	addToQueue(root);
	
	while (head != NULL){
		//取出队列的头结点
		QNODE *headNode = queuePop();
		//打印其值
		TNODE *tempNode = headNode->value;
		printf("%d\n", tempNode->value);
		
		//判断其左子节点是否存在,若存在,加入队列;
		if (tempNode->leftPointer != NULL){
			addToQueue(tempNode->leftPointer);
		}		
		
		//判断其右子节点是否存在,若存在,加入队列; 
		if (tempNode->rightPointer != NULL){
			addToQueue(tempNode->rightPointer);
		}
	} 
}

//删除

void deletenum()
{
	if(root==NULL)
	{
		return;
	}
	QNODE* node9=stackPop();
	TNODE* node0=node9->value;
	head = NULL;
	tail = NULL;//把对列清空	
		
	//把root加到队列
	addToQueue(root);
	while (head != NULL){
		//取出队列的头结点
		QNODE *headNode = queuePop();
		//打印其值
		TNODE *tempNode = headNode->value;
		
		//判断其左子节点是否存在,若存在,加入队列;
		if (tempNode->leftPointer != NULL){
			addToQueue(tempNode->leftPointer);
		}		
		
		//判断其右子节点是否存在,若存在,加入队列; 
		if (tempNode->rightPointer != NULL){
			addToQueue(tempNode->rightPointer);
		}
		if(tempNode->leftPointer->value==node0->value)
		{
			tempNode->leftPointer=NULL;
			free(node0);
			break;
		}
		if(tempNode->rightPointer->value==node0->value)
		{
			tempNode->rightPointer=NULL;
			free(node0);
			break;
		}
		
	} 
 } 
int main(){
	
	TNODE* node = (TNODE*)malloc(sizeof(TNODE));
	node->value = 1;
	node->leftPointer = NULL;
	node->rightPointer = NULL;
	root = node; 
	
	//将其加入到队列中
	addToQueue(node);	
	addToStack(node);
	while(head != NULL){
		//取出来队列的头结点
		QNODE *headNode = queuePop(); 
		
		printf("请输入新左子节点的值:");
		int temp1;
		scanf("%d", &temp1);
		if (temp1 == 0){
			break;
		}
		TNODE* pLeftNode = (TNODE*)malloc(sizeof(TNODE));
		pLeftNode->value = temp1;
		pLeftNode->leftPointer = NULL;
		pLeftNode->rightPointer = NULL;		
		TNODE* topNode = headNode->value;
		topNode->leftPointer = pLeftNode;
		addToQueue(pLeftNode);
		addToStack(pLeftNode);
		printf("请输入新右子节点的值:");
		int temp2;
		scanf("%d", &temp2);
		if (temp2 == 0){
			break;
		}
		TNODE* pRightNode = (TNODE*)malloc(sizeof(TNODE));
		pRightNode->value = temp2;
		pRightNode->leftPointer = NULL;
		pRightNode->rightPointer = NULL;				
		topNode->rightPointer = pRightNode;
		addToQueue(pRightNode);
		addToStack(pRightNode);
	}
	
	//testing queue	
	//displayAllDataInQueue();
	
	printf("以下为完全二叉树的值:\n");
	//testing tree
	displayAllDataInTree();
	
	//删除最后一个节点
	
	deletenum();
	
	//
	printf("以下为完全二叉树的值:\n");
	//testing tree
	displayAllDataInTree();
	
	
	return 0;
}

运行结果:
在这里插入图片描述
2、不完全二叉树

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

struct TNODE{
	int value;
	TNODE *leftPointer;
	TNODE *rightPointer;
};

//队列用的节点 
struct QNODE{
	TNODE *value;
	QNODE *pNext;
};

//树的根节点指针 
TNODE *root = NULL; 

//队列的头和尾部 
QNODE *head = NULL;
QNODE *tail = NULL; 
QNODE *head1 = NULL;
QNODE *tail1 = NULL; 
void addToQueue(TNODE* node){
	QNODE *qNode = (QNODE*)malloc(sizeof(QNODE));
	qNode->value = node;
	qNode->pNext = NULL;
	 
	if (head == NULL){
		head = qNode;
		tail = qNode;	
	}else{
		tail->pNext = qNode;
		tail = qNode;
	}
}
void addToStack(TNODE* node){
	QNODE *qNode = (QNODE*)malloc(sizeof(QNODE));
	qNode->value = node;
	qNode->pNext = NULL;
	 
	if (head1 == NULL){
		head1 = qNode;
		tail1 = qNode;	
	}else{
		qNode->pNext=head1;
		head1=qNode;
	}
}

void displayAllDataInQueue(){
	QNODE* p = head;
	while(p != NULL){
		TNODE* node = p->value;
		
		printf("%d\n", node->value);
		
		p = p->pNext;
	}
}

//从队列头部弹出一个节点 
QNODE* queuePop(){	
	QNODE* headNODE = head;
	head = head->pNext;
	if (head == NULL){
		tail = NULL;
	}
	
	return headNODE;
}
//栈弹出
QNODE* stackPop(){	
	QNODE* headNODE = head1;
	head1 = head1->pNext;
	if (head1 == NULL){
		tail1 = NULL;
	}
	
	return headNODE;
} 
void displayAllDataInTree(){
	if (root == NULL)
		return;	
	
	head = NULL;
	tail = NULL;	
		
	//把root加到队列
	addToQueue(root);
	
	while (head != NULL){
		//取出队列的头结点
		QNODE *headNode = queuePop();
		//打印其值
		TNODE *tempNode = headNode->value;
		printf("%d\n", tempNode->value);
		
		//判断其左子节点是否存在,若存在,加入队列;
		if (tempNode->leftPointer != NULL){
			addToQueue(tempNode->leftPointer);
		}		
		
		//判断其右子节点是否存在,若存在,加入队列; 
		if (tempNode->rightPointer != NULL){
			addToQueue(tempNode->rightPointer);
		}
	} 
}

//删除

void deletenum()
{
	if(root==NULL)
	{
		return;
	}
	QNODE* node9=stackPop();
	TNODE* node0=node9->value;
	head = NULL;
	tail = NULL;//把对列清空	
		
	//把root加到队列
	addToQueue(root);
	while (head != NULL){
		//取出队列的头结点
		QNODE *headNode = queuePop();
		//打印其值
		TNODE *tempNode = headNode->value;
		
		//判断其左子节点是否存在,若存在,加入队列;
		if (tempNode->leftPointer != NULL){
			addToQueue(tempNode->leftPointer);
		}		
		
		//判断其右子节点是否存在,若存在,加入队列; 
		if (tempNode->rightPointer != NULL){
			addToQueue(tempNode->rightPointer);
		}
		if(tempNode->leftPointer->value==node0->value)
		{
			tempNode->leftPointer=NULL;
			free(node0);
			break;
		}
		if(tempNode->rightPointer->value==node0->value)
		{
			tempNode->rightPointer=NULL;
			free(node0);
			break;
		}
		
	} 
 } 
int main(){
	
	TNODE* node = (TNODE*)malloc(sizeof(TNODE));
	node->value = 1;
	node->leftPointer = NULL;
	node->rightPointer = NULL;
	root = node; 
	
	//将其加入到队列中
	addToQueue(node);	
	addToStack(node);
	while(head != NULL){
		//取出来队列的头结点
		QNODE *headNode = queuePop(); 
		
		printf("请输入新左子节点的值:");
		int temp1;
		scanf("%d", &temp1);
		if (temp1 == 0){
			break;
		}
		if(temp1==-1){
		TNODE* pLeftNode = (TNODE*)malloc(sizeof(TNODE));
		pLeftNode->value = NULL;
		pLeftNode->leftPointer = NULL;
		pLeftNode->rightPointer = NULL;		
		TNODE* topNode = headNode->value;
		topNode->leftPointer = pLeftNode;
		addToQueue(pLeftNode);
		addToStack(pLeftNode);
		} 
		else{
		TNODE* pLeftNode = (TNODE*)malloc(sizeof(TNODE));
		pLeftNode->value = temp1;
		pLeftNode->leftPointer = NULL;
		pLeftNode->rightPointer = NULL;		
		TNODE* topNode = headNode->value;
		topNode->leftPointer = pLeftNode;
		addToQueue(pLeftNode);
		addToStack(pLeftNode);
	    }
		printf("请输入新右子节点的值:");
		int temp2;
		scanf("%d", &temp2);
		if (temp2 == 0){
			break;
		}
		if(temp2==-1){
		TNODE* pRightNode = (TNODE*)malloc(sizeof(TNODE));
		pRightNode->value = NULL;
		pRightNode->leftPointer = NULL;
		pRightNode->rightPointer = NULL;
		TNODE* topNode = headNode->value;				
		topNode->rightPointer = pRightNode;
		addToQueue(pRightNode);
		addToStack(pRightNode);	
		}
		else{
		TNODE* pRightNode = (TNODE*)malloc(sizeof(TNODE));
		pRightNode->value = temp2;
		pRightNode->leftPointer = NULL;
		pRightNode->rightPointer = NULL;		
		TNODE* topNode = headNode->value;
		topNode->rightPointer = pRightNode;
		addToQueue(pRightNode);
		addToStack(pRightNode);
	    }
	}
	
	//testing queue	
	//displayAllDataInQueue();
	
	printf("以下为非完全二叉树的值:\n");
	//testing tree
	displayAllDataInTree();
	
	//删除最后一个节点
	
	deletenum();
	
	//
	printf("以下为非完全二叉树的值:\n");
	//testing tree
	displayAllDataInTree();
	
	
	return 0;
}


运行结果:
-1部分为空

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值