程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2418 二叉查找樹

poj 2418 二叉查找樹

編輯:C++入門知識

/*

二叉查找樹:對於樹中的每個節點X,它的左子樹中的所有節點的值小於X的值,它的右子樹中的所有節點的值大於X的值;

*/

題目大意:給出一些單詞(包含大小寫和空格),單詞可以重復出現(單詞最多10000種,最多1000000個)。要求按字典序輸出單詞並輸出每個單詞占的比例;

思路:單詞的比較可以用strcmp,由於單詞數較多,直接排序可能超時,若用字典樹的話需要的空間較大。因此可以考慮將單詞作為二叉查找樹的關鍵字建樹,然後按中序遍歷輸出。


[cpp]
#include<iostream>  
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
using namespace std; 
struct node 

    char word[33]; 
    int cnt; 
    node *left,*right; 
    node(char *n){ 
        strcpy(word,n); 
        cnt=1; 
        left=NULL; 
        right=NULL; 
    } 
}*root; 
double count; 
//插入二叉查找樹  
node* insert(char *word,node *p) 

    if(p==NULL){ 
        p=new node(word); 
    } 
    else if(strcmp(word,p->word)<0) 
        p->left=insert(word,p->left); 
    else if(strcmp(word,p->word)>0) 
        p->right=insert(word,p->right); 
    else 
        p->cnt++; 
    return p; 

//輸出中序遍歷結果  
void output(node *p) 

    if(p==NULL) 
        return; 
    output(p->left); 
    printf("%s %.4lf\n",p->word,(p->cnt)/count*100); 
    output(p->right); 
    delete p; 

int main() 

    char word[33]; 
    count=0; 
    while(gets(word)){ 
        root=insert(word,root); 
        count++; 
    } 
    output(root); 
    return 0; 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct node
{
 char word[33];
 int cnt;
 node *left,*right;
 node(char *n){
  strcpy(word,n);
  cnt=1;
  left=NULL;
  right=NULL;
 }
}*root;
double count;
//插入二叉查找樹
node* insert(char *word,node *p)
{
 if(p==NULL){
  p=new node(word);
 }
 else if(strcmp(word,p->word)<0)
  p->left=insert(word,p->left);
 else if(strcmp(word,p->word)>0)
  p->right=insert(word,p->right);
 else
  p->cnt++;
 return p;
}
//輸出中序遍歷結果
void output(node *p)
{
 if(p==NULL)
  return;
 output(p->left);
 printf("%s %.4lf\n",p->word,(p->cnt)/count*100);
 output(p->right);
 delete p;
}
int main()
{
 char word[33];
 count=0;
 while(gets(word)){
  root=insert(word,root);
  count++;
 }
 output(root);
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved