二叉查找树(BST:binary search tree)

  二叉查找树又可以叫做二叉排序树,它是一颗空树或者是具有如下性质的二叉树:

  1. 若它的左子树非空,则左子树上所有结点的值均小于根结点的值
  2. 若它的右子树非空,则右子树上所有结点的值均大于根结点的值
  3. 左、右子树本身又各是一棵二叉排序树

POJ2418 http://poj.org/problem?id=2418

 

 1 #include<iostream>
2 #include<iomanip>
3 using namespace std;
4
5 long total=1;
6
7 struct Node
8 {
9 char treename[35];
10 int tree_num;
11 Node *left_node;
12 Node *right_node;
13 };
14
15 void InsertNode(Node &node,char *str)
16 {
17 int flag = strcmp(node.treename,str);
18 if (flag == 0)
19 node.tree_num++;
20 else if(flag<0) //右子树
21 {
22 if (node.right_node == NULL)
23 {
24 Node *right_node = new Node;
25 strcpy(right_node->treename,str);
26 right_node->tree_num = 1;
27 right_node->left_node = NULL;
28 right_node->right_node = NULL;
29 node.right_node = right_node;
30 return;
31 }
32 else
33 InsertNode(*node.right_node,str);
34 }
35 else if (flag>0) //左子树
36 {
37 if (node.left_node == NULL)
38 {
39 Node *left_node = new Node;
40 strcpy(left_node->treename,str);
41 left_node->tree_num = 1;
42 left_node->left_node = NULL;
43 left_node->right_node = NULL;
44 node.left_node = left_node;
45 return;
46 }
47 else
48 InsertNode(*node.left_node,str);
49
50 }
51
52 }
53
54 void OutPutNode(Node* node)
55 {
56 if(node->left_node != NULL)
57 OutPutNode(node->left_node);
58 cout<<node->treename<<""<<fixed<<setprecision(4)<<(double)node->tree_num/(double)total*100<<endl;
59 if(node->right_node != NULL)
60 OutPutNode(node->right_node);
61 }
62
63 int main()
64 {
65 char str[35];
66 Node root;
67
68 gets(str);
69 root.tree_num = 1;
70 root.left_node = NULL;
71 root.right_node = NULL;
72 strcpy(root.treename,str);
73
74 while (gets(str)!=NULL)
75 {
76 InsertNode(root,str);
77 total++;
78 }
79
80 OutPutNode(&root);
81
82 return 0;
83 }


posted @ 2011-10-28 16:52  南风又起  阅读(328)  评论(0编辑  收藏  举报