广东工业大学anyview题解

这里是anyview的部分题解

DC06PE46

题目描述:
利用队列的基本操作,编写复制一棵又树的非递归算法。
要求实现下列函数:void CopyBiTree(BiTree T, BiTree &TT);

typedef char TElemType;
typedef struct BiTNode {
	TElemType data;
	BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

非递归算法

#include<iostream>
#include<queue>
BiTNode* func(){
    BiTNode * node = (BiTNode*)malloc(sizeof(BiTNode));
    if(!node)return NULL;
    node->data = 0;
    node->lchild = NULL;
    node->rchild = NULL;
    return node;
}

void CopyBiTree(BiTree T, BiTree &TT)
{  
    TT = func();
    if(T==NULL){
        TT = NULL;
        return ;
    }
    std::queue<BiTree> Q1;
    std::queue<BiTree> Q2;
    Q1.push(T);Q2.push(TT);
    BiTree p1=NULL,p2=NULL;
    while(!Q1.empty()){//队列不为空
            p1 = Q1.front();Q1.pop();
            p2 = Q2.front();Q2.pop();
            p2->data = p1->data;//节点复制
        if(p1->lchild){
            Q1.push(p1->lchild);
            p2->lchild = func();
            Q2.push(p2->lchild);
        }
        if(p1->rchild){
            Q1.push(p1->rchild);
            p2->rchild = func();
            Q2.push(p2->rchild);
        }
    }
}

DC06PE58

题目描述:
假设二叉树中结点值互不相同,编写算法: 求二又树中以元素值为x的结点为根的子树的结点总数。
实现下列函数:int xSum(BiTree T, TElemType x);

typedef struct BiTNode {
	TElemType data;
	struct BiTNode*lchild,*rchild; 
}BiTNode,*BiTree;

非递归算法

BiTNode* func(BiTree T,TElemType x){
    if(T== NULL)return NULL;
    if(T->data == x){
        return T;
    }
    BiTNode * left = func(T->lchild,x);
    if(left) return left;
    BiTNode *right = func(T->rchild,x);
    if(right) return right;
    return NULL;
}
int CountNode(BiTree T){
    if(T == NULL)return 0;
        int left_node = CountNode(T->lchild);
        int right_node = CountNode(T->rchild);
            return left_node+right_node+1; 
}
int xSum(BiTree T, TElemType x)
{  
    //先找到X节点
    BiTree p = func(T,x);
    return CountNode(p);
}

DC06PE75

题目描述:
在二叉排序树的每个结点中增设一个lsize域,其值为该结点的左子树中的结点数加1。求树中第k小的结点的位置。
实现函数BSTNode *Ranking(BSTree T, int k);

// 节点定义如下:
typedef char KeyType;

typedef struct BSTNode {
	KeyType key;
	struct BSTNode *lchild,*rchild;
	int lsize; 
}BSTNode,*BSTree;

非递归算法

#include<iostream>
#include<stack>
BSTree func(BSTree T,int numkey){
    if(T==NULL)return NULL;
    std::stack<BSTree> S;
    BSTree p;
     p = T;
     int count = 0;
    while(!S.empty()||p!=NULL){
        while(p!=NULL){
            S.push(p);
            p = p->lchild;
        }
        p = S.top();S.pop();
        count++;//访问到了这个节点
        if(numkey == count){
            return p;
        }
        else if(p->rchild!=NULL){
            p = p->rchild;
        }else p = NULL;
    }
    return NULL;
}
BSTNode *Ranking(BSTree T, int k) 
{   
    // 方法1
    if(T == NULL)return NULL;
    if(k == T->lsize)return T;
    // 如果值在左子树
    if(T->lsize>k){
        //进行中序遍历
        return func(T->lchild,k);
    }
    if(T->lsize<k){
        //进入右子树寻找,进行中序遍历
        return func(T->rchild,k-(T->lsize));
    }
    return NULL;
    
}

递归算法

BSTNode *Ranking(BSTree T, int k) 
{   
    if(NULL == T)return NULL;
    if(T->lsize==k)return T;
    else if(k<T->lsize) return Ranking(T->lchild,k);
    else return Ranking(T->rchild,k-T->lsize);
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值