一
昨天写了个哈夫曼树,其实难到不难,重点是利用标准库里的优先队列就很好办了
哈夫曼树主要是建立个最小堆,求最小加权路径,就是求哈夫曼树中非叶子结点的权值和
#include<queue>
priority_queue<int> Q 这个是最大堆
最小堆这样写:priority_queue<int, vector<int>, greater<int> > Q 另外,用vs2012写的时候总是不能过,是因为还需要加一个头文件,#include<functional>
二
重点说说二叉树,
可根据包括中序遍历的两个遍历确定一棵树
写程序时需注意给节点申请空间什么的,主要是我对指针什么的还是理解的不太透彻,所以还是需要注意一下
贴个代码:根据前序和中序确定后序
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
struct Node{
Node* lchild;
Node* rchild;
char c;//保存该节点字符信息
}Tree[50];
int cnt;//代表树的节点个数
Node* create(){//申请结点空间
Tree[cnt].lchild=Tree[cnt].rchild=NULL;
return &Tree[cnt++];
}
char str1[30];
char str2[30];
Node* build(int s1,int e1,int s2, int e2)
{//str1[s1],str1[e1]为前序遍历
Node *res=create();//为根节点申请空间
res->c=str1[s1];
int rootidx;//代表根节点在中序遍历中的位置
for(int i=s2;i<=e2;i++)
{
if(str2[i]==str1[s1])
{
rootidx=i;
break;
}
}
if(rootidx!=s2){
//左子树不为空,还原左子树
res->lchild=build(s1+1,s1+(rootidx-s2),s2,rootidx-1);
}
if(rootidx!=e2){
res->rchild=build(s1+(rootidx-s2)+1,e1,rootidx+1,e2);
}
return res;//返回根节点指针
}
void postOrder(Node* t){
if(t->lchild!=NULL)
postOrder(t->lchild);
if(t->rchild!=NULL)
postOrder(t->rchild);
cout<<t->c;
}
int main(){
while(cin>>str1)
{
cin>>str2;
cnt=0;
int l1=strlen(str1);
int l2=strlen(str2);
Node *T=build(0,l1-1,0,l2-1);
postOrder(T);
cout<<endl;
}
return 0;
}
二叉搜索树:
-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
以及数组tree需要申请大一点,一开始申请50个,发现不够,runtime error ,改成100个就可以了
以及因为有一些变量需要循环使用,每次使用前要置初值!!!
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;
struct Node{
Node* lchild;
Node* rchild;
int c;
}Tree[100];
int loc;
Node *create(){
Tree[loc].lchild=Tree[loc].rchild=NULL;
return &Tree[loc++];
}
Node* insert(Node* T,int x){
if(T==NULL)
{
T=create();
T->c=x;
}
else
{
if(x<T->c)
T->lchild=insert(T->lchild,x);
if(x>T->c)
T->rchild=insert(T->rchild,x);
}
return T;
}
char str1[25];
char str2[25];
int size1,size2;
char* str;//当前正在保存的字符串
int* size;//当前正在保存的字符串的个数
void preOrder(Node* T){
str[(*size)++]=T->c+'0';
if(T->lchild!=NULL)
preOrder(T->lchild);
if(T->rchild!=NULL)
preOrder(T->rchild);
}
void inOrder(Node* T){
if(T->lchild!=NULL)
preOrder(T->lchild);
str[(*size)++]=T->c+'0';
if(T->rchild!=NULL)
preOrder(T->rchild);
}
int main(){
int n;
char tmp[12];
while(cin>>n&&n!=0){
cin>>tmp;
loc=0;
Node* T=NULL;
for(int i=0;tmp[i]!='\0';i++)
T=insert(T,tmp[i]-'0');
size1=0;//初始化为0
str=str1;//将str的首地址指向str1的首地址所指向的地方
size=&size1;
preOrder(T);
inOrder(T);
str1[size1]='\0';
// cout<<str1<<endl;
while(n--!=0)
{
cin>>tmp;
Node* T2=NULL;
for(int i=0;tmp[i]!='\0';i++)
T2=insert(T2,tmp[i]-'0');
size2=0;//初始化为0
str=str2;//将str的首地址指向str2的首地址所指向的地方
size=&size2;
preOrder(T2);
inOrder(T2);
str2[size2]='\0';
if(strcmp(str1,str2)==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}