5.1
#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
// BiTNode* transform(CSNode *root){
// if(root==NULL) return NULL;
// BiTree broot;
// broot = (BiTree)malloc(sizeof(struct Node));
// broot->left=NULL;broot->right=NULL;broot->data=root->data;
// Queue *queue;
// Queue *bqueue;
// queue=create_queue();bqueue=create_queue();
// add_queue(queue,root);add_queue(bqueue,broot);
// while(!is_empty_queue(queue)){
// //分别取一个结点
// CSNode *node=del_queue(queue);
// BiTree bTreenode=del_queue(bqueue);
// int i;
// BiTree former=NULL;
// for(i=0;i<MAX_CHILDREN_NUM;i++){
// if(node->children[i]){
// BiTree bnode = (BiTree)malloc(sizeof(struct Node));
// bnode->left = bnode->right = NULL;
// bnode->data = node->children[i]->data;
// if(i==0) bTreenode->left=bnode;
// else former->right=bnode;
// former=bnode;
// add_queue(queue, node->children[i]);
// add_queue(bqueue, bnode);
// }
// }
// }
// free(queue->array);
// free(bqueue->array);
// free(queue);
// free(bqueue);
// return broot;
// }
BiTNode* transform(CSNode *root){
if(root==NULL) return NULL;
BiTree broot;
broot=(BiTNode*)malloc(sizeof(BiTNode));
broot->data=root->data;
broot->left=NULL;broot->right=NULL;
Queue *queue=create_queue();Queue *bqueue=create_queue();
add_queue(bqueue,broot);add_queue(queue,root);
while(!is_empty_queue(queue)){
CSNode *node=del_queue(queue);
BiTree bnode=del_queue(bqueue);
int i;
BiTree former=NULL;
for(i=0;i<MAX_CHILDREN_NUM;i++){
if(node->children[i]){
BiTree q=(BiTNode*)malloc(sizeof(BiTNode));
q->left=NULL;q->right=NULL;
q->data=node->children[i]->data;
if(i==0) bnode->left=q;
else former->right=q;
former=q;
add_queue(queue,node->children[i]);add_queue(bqueue,q);
}
}
}
free(queue->array);
free(bqueue->array);
free(queue);
free(bqueue);
return broot;
}
5.2
#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
BiTNode * nearest_ancestor(BiTree root, BiTNode *p, BiTNode *q){
Stack p1,q1;
init_stack(&p1);
init_stack(&q1);
path(root,p,&p1);
path(root,q,&q1);
int base=0;
if(p1.elem[0]!=q1.elem[0]) return NULL;
BiTNode *cur=q1.elem[0];;
for(base=1;base<p1.top&&base<q1.top;base++){
if(p1.elem[base]==q1.elem[base]){
cur=p1.elem[base];
}else{
return cur;
}
}
return cur;
}
5.3
#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
bool path(BiTNode* root, BiTNode* node, Stack* s){
BiTNode *p=root,*r=NULL;
if(p==NULL||node==NULL||!is_empty(s)){
return 0;
}
while(p!=NULL||!is_empty(s)){
if(p!=NULL){
push(s,p);
if(p==node){
return 1;
}
p=p->left;
}else{
top(s,&p);
if(p->right==NULL||p->right==r){
r=p;
pop(s,&p);
p=NULL;
}else{
p=p->right;
}
}
}
return 0;
}
5.4
#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
void pre_order(BiTree root){
Stack S[Stack_Size];
init_stack(S);
BiTree T=root;
while(T||!is_empty(S)){
while(T){
visit_node(T);
push(S,T);
T=T->left;
}
pop(S,&T);
T=T->right;
}
}