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