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部分为空