icoding数据结构——树二叉树

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;
    }
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值