【王道数据结构】【chapter5树与二叉树】【P159t17~19】【统考真题】

目录

2014年统考

2017年统考

2022年统考


2014年统考

#include <iostream>
#include <stack>
#include <queue>
typedef struct treenode{
    int weight;
    struct treenode *left;
    struct treenode *right;
}treenode,*ptreenode;

ptreenode buytreenode(int x)
{
    ptreenode n=(ptreenode) malloc(sizeof (treenode));
    n->weight=x;
    n->left= nullptr,n->right= nullptr;
    return n;
}
ptreenode build_tree1()
{
    ptreenode root= buytreenode(1);
    root->left= buytreenode(2);
    root->right= buytreenode(3);
    root->left->left= buytreenode(4);
    root->left->right= buytreenode(5);
    root->right->left= buytreenode(6);
    root->right->right= buytreenode(7);
    root->left->left->left= buytreenode(8);
    root->left->left->right= buytreenode(9);
    return root;
}

void print_tree(ptreenode root) {
    std::queue<ptreenode> tmp;
    tmp.push(root);
    int s = tmp.size();
    while (!tmp.empty()) {
        ptreenode t = tmp.front();
        tmp.pop();
        s--;
        printf("%3d", t->weight);
        if (t->left) tmp.push(t->left);
        if (t->right) tmp.push(t->right);
        if (s == 0) puts(""), s = tmp.size();
    }
}

int _wpl(ptreenode root,int depth)
{
    if(root== nullptr) return 0;
    if(!root->left&&!root->right) return root->weight *depth;
    return _wpl(root->left,depth+1)+ _wpl(root->right,depth+1);
}
int _wpl2(ptreenode root)
{
    if(root== nullptr) return 0;
    if(!root->left&&!root->right) return 0;
    int w_l,w_r;
    w_l= _wpl2(root->left);
    w_r= _wpl2(root->right);
    root->weight=root->left->weight+root->right->weight;
    return w_l+w_r+root->weight;

}
int wpl(ptreenode root)
{
    return _wpl(root,0);
}
int wpl2(ptreenode root)
{
    return _wpl2(root);
}
int main() {
    ptreenode root1=build_tree1();
    print_tree(root1);
    printf("the answer should be:%3d\n",8*3+9*3+5*2+6*2+7*2);
    //方法1
    printf("%3d\n",wpl(root1));
    //方法2
    printf("%3d\n",wpl2(root1));
    return 0;
}

2017年统考

#include <iostream>
#include <stack>
#include <queue>
#include <string>

typedef struct treenode {
    std::string data;
    struct treenode *left;
    struct treenode *right;
} treenode, *ptreenode;

ptreenode buytreenode(std::string x) {
    ptreenode n = new treenode; // 使用 new 来动态分配内存
    n->data = x;
    n->left = nullptr;
    n->right = nullptr;
    return n;
}

ptreenode build_tree1()
{
    ptreenode root= buytreenode("*");
    root->left= buytreenode("+");
    root->right= buytreenode("*");
    root->left->left= buytreenode("a");
    root->left->right= buytreenode("b");
    root->right->left= buytreenode("c");
    root->right->right= buytreenode("-");
    root->right->right->right= buytreenode("d");
    return root;
}

ptreenode build_tree2()
{
    ptreenode root= buytreenode("+");
    root->left= buytreenode("*");
    root->right= buytreenode("-");
    root->left->left= buytreenode("a");
    root->left->right= buytreenode("b");
    root->right->right= buytreenode("-");
    root->right->right->left= buytreenode("c");
    root->right->right->right= buytreenode("d");

    return root;
}


void print_tree(ptreenode root) {
    std::queue<ptreenode> tmp;
    tmp.push(root);
    int s = tmp.size();
    while (!tmp.empty()) {
        ptreenode t = tmp.front();
        tmp.pop();
        s--;
        printf("%3s", t->data.c_str());
        if (t->left) tmp.push(t->left);
        if (t->right) tmp.push(t->right);
        if (s == 0) puts(""), s = tmp.size();
    }
}

std::string trans(ptreenode root,int depth)
{
    if(root== nullptr) return "";
    if(!root->left&&!root->right) return root->data;
    if(depth==0){
        return trans(root->left,depth+1)+root->data+ trans(root->right,depth+1);
    }
    return "("+ trans(root->left,depth+1)+root->data+ trans(root->right,depth+1)+")";

}
int main() {
    ptreenode root1=build_tree1();
    print_tree(root1);
    printf("%s\n",trans(root1,0).c_str());

    ptreenode root2=build_tree2();
    print_tree(root2);
    printf("%s\n",trans(root2,0).c_str());
    return 0;
}

2022年统考

#include <iostream>
#define MAX_SIZE 20
typedef struct{
    int SqBiTNode[MAX_SIZE];
    int ElemNum;//实际占用的数组元素个数
}SqBiTree;

bool search_tree(SqBiTree tree,int pos)
{
    if (pos>tree.ElemNum||tree.SqBiTNode[pos]==-1) return true;
    if(pos*2+1<tree.ElemNum&&(pos*2+2)<tree.ElemNum&&tree.SqBiTNode[pos*2+1]!=-1&&tree.SqBiTNode[pos*2+2]!=-1)
    {
        bool tmp=(tree.SqBiTNode[pos]>=tree.SqBiTNode[pos*2+1])&&(tree.SqBiTNode[pos]<=tree.SqBiTNode[pos*2+2]);
        return search_tree(tree,pos*2+1)&& search_tree(tree,pos*2+2)&&tmp;
    }
    if(pos*2+1<tree.ElemNum&&tree.SqBiTNode[pos*2+1]!=-1) return tree.SqBiTNode[pos]>=tree.SqBiTNode[pos*2+1]&& search_tree(tree,pos*2+1);
    if(pos*2+2<tree.ElemNum&&tree.SqBiTNode[pos*2+2]!=-1) return tree.SqBiTNode[pos]<=tree.SqBiTNode[pos*2+2]&& search_tree(tree,pos*2+2);

}

bool search_tree2(SqBiTree tree,int pos,int &pre)
{
    if (pos<tree.ElemNum&&tree.SqBiTNode[pos]!=-1) {
        if (!search_tree2(tree, 2 * pos + 1, pre)) return false;
        if (tree.SqBiTNode[pos] <= pre) return false;
        pre = tree.SqBiTNode[pos];
        if (!search_tree2(tree, 2 * pos + 2, pre)) return false;
    }
    return true;
}
int main() {
    SqBiTree t1;
    int values[] = {40, 25, 60, -1, 30, -1, 80, -1, -1, 27};
    std::copy(values, values + sizeof(values) / sizeof(values[0]), t1.SqBiTNode);
    t1.ElemNum=10;
    // 打印数组
    for (int i = 0; i < t1.ElemNum; ++i) {
        std::cout << t1.SqBiTNode[i] << " ";
    }
    std::cout << std::endl;


    SqBiTree t2;
    int values2[] = {40,50,60,-1,30,-1,-1,-1,-1,-1,35};
    std::copy(values2, values + sizeof(values2) / sizeof(values2[0]), t2.SqBiTNode);
    t2.ElemNum=11;

    // 打印数组
    for (int i = 0; i < t2.ElemNum; ++i) {
        std::cout << t2.SqBiTNode[i] << " ";
    }
    std::cout << std::endl;

    if(search_tree(t1,0)) printf("tree1 is a search tree\n");
    else printf("tree1 is not a search tree\n");

    if(search_tree(t2,0)) printf("tree2 is a search tree\n");
    else printf("tree2 is not a search tree\n");

    int pre=-1;
    if(search_tree2(t1,0,pre)) printf("tree1 is a search tree\n");
    else printf("tree1 is not a search tree\n");
    pre=-1;
    if(search_tree2(t2,0,pre)) printf("tree2 is a search tree\n");
    else printf("tree2 is not a search tree\n");
    return 0;
}

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桜キャンドル淵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值