Huffman Codes
本题的思路是先创建哈夫曼树,求得最优WPL。之后先将待测作业的WPL计算得出,若不同于哈夫曼树的WPL必不正确;之后将待测作业编码建树来判断是否前缀冲突,若前缀冲突必不正确,反之正确。
检测编码是否冲突的核心
- 首先将所有作业中的编码按照长度递减排序
- 之后将编码建树,编码的最后一位应该落在空处;如果没有落在空处说明编码冲突。
#include
#include
家谱处理
使用栈寻找父亲结点,使用map连接虚关系<子节点,父节点>
#include
#include
搜索树判断
本题给出二叉搜索树或者二叉镜像树的前序遍历,判断是否正确,并且给出后序遍历。
最初想的是将前序遍历排序得到中序遍历,利用前序遍历和中序遍历就可建树,不过过于麻烦,首先判断是二叉搜索树还是镜像搜索树,之后在建树的过程中还需根据树的类型查找中序遍历中根的位置。二叉搜索树的根在中序遍历为第一个大于等于根的值的位置;而二叉镜像树的根在最后一个大于等于根的值的位置。 不过最终没有满分。
现在该思路为利用先序遍历作为输入,建立二叉搜索树,求得前序遍历。二叉镜像树的前序遍历可由二叉搜索树得到,只需在前序遍历时先访问右子结点。相同方法得到后序遍历。判断输入遍历是否为二叉搜索树或二叉镜像树遍历的一种,之后输出后序遍历即可。
#include
#include
using namespace std;
vectororiginalPre;
vectorpre,preMirror,post,postMirror;
struct Node {
int val;
Node*left=nullptr;
Node*right=nullptr;
Node() {
}
Node(int val):val(val) {
}
Node(int val,Node*left,Node*right):val(val),left(left),right(right) {
}
};
Node* insert(Node*root,int newVal) {
if(root==nullptr) {
root=new Node(newVal);
} else if(newValval) {
root->left=insert(root->left,newVal);
} else
root->right=insert(root->right,newVal);
return root;
}
void preOrder(Node*root) {
if(root==nullptr) {
return;
}
pre.push_back(root->val);
preOrder(root->left);
preOrder(root->right);
}
void preMirrorOrder(Node*root){
if(root==nullptr){
return;
}
preMirror.push_back(root->val);
preMirrorOrder(root->right);
preMirrorOrder(root->left);
}
void postOrder(Node*root){
if(root==nullptr){
return;
}
postOrder(root->left);
postOrder(root->right);
post.push_back(root->val);
}
void postMirrorOrder(Node*root){
if(root==nullptr){
return;
}
postMirrorOrder(root->right);
postMirrorOrder(root->left);
postMirror.push_back(root->val);
}
int main() {
int N;
int val;
Node*root=nullptr;
cin>>N;
for(int i=0; i>val;
originalPre.push_back(val);
root=insert(root,val);
}
preOrder(root);
preMirrorOrder(root);
postOrder(root);
postMirrorOrder(root);
//二叉搜索树的先序遍历
if(originalPre==pre){
cout<<"YES"<
目录树
根据目录归档文件重建目录树,需要注意的是目录需要在文件之前打印,需要在Node中设置一个表示isFolder来记录。递归建树,递归打印。
#include
#include