12_6.c
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 12_6.cpp                    */
  3. /*    二元树类别实作                        */
  4. /* ======================================== */
  5. #include <iostream.h>
  6. struct node                       /* 树的结构宣告       */
  7. {
  8.    int data;                      /* 节点资料           */
  9.    node *left;                    /* 指向左子树的指标   */
  10.    node *right;                   /* 指向右子树的指标   */
  11. };
  12. class binaryTree                  /* 二元树的类别宣告   */
  13. {
  14. private:
  15.    node *head;                    /* 根节点的指标       */
  16.    void inorder(node *ptr);       /* 成员函数:中序走访  */
  17. public:
  18.    binaryTree() { head = NULL; }  /* 建构函数宣告       */
  19.    void insertNode(int d);        /* 插入节点函数宣告   */
  20.    void printTree();              /* 显示二元树的节点   */
  21.    int search(int d);             /* 二元树的走访搜寻   */
  22. };
  23. /* ---------------------------------------- */
  24. /*  成员函数: 二元树中序走访                */
  25. /* ---------------------------------------- */
  26. void binaryTree::inorder(node *ptr)
  27. {
  28.     if ( ptr != NULL )             /* 终止条件           */
  29.     {
  30.        inorder(ptr->left);         /* 左子树             */
  31.        /* 列印节点内容       */
  32.        cout << "[" << ptr->data << "]"; 
  33.        inorder(ptr->right);        /* 右子树             */
  34.     }
  35. };
  36. /* ---------------------------------------- */
  37. /*  插入二元树的节点                        */
  38. /* ---------------------------------------- */
  39. void binaryTree::insertNode(int d)
  40. {
  41.    /* 建立新节点记忆体 */
  42.    node *temp = new node;           /* 建立新节点         */
  43.    node *current;                   /* 目前树节点指标     */
  44.    int inserted = 0;                /* 是否插入新节点     */
  45.    temp->data = d;                  /* 建立节点内容       */
  46.    temp->left = NULL;               /* 设定指标初值       */
  47.    temp->right = NULL;              /* 设定指标初值       */
  48.    if ( head == NULL )              /* 是否是根节点       */
  49.       head = temp;                  /* 根节点指标为新节点 */
  50.    else
  51.    {
  52.       current = head;               /* 保留目前树指标     */
  53.       while( !inserted )
  54.       {
  55.          /* 比较节点值   */
  56.  if ( current->data > temp->data )
  57.  {
  58.     if ( current->left == NULL ) /* 是否是最左的子节点 */
  59.     {
  60.        current->left = temp; /* 接起父子的链结     */
  61.        inserted = 1;         /* 已经插入 */
  62.     }
  63.     else
  64.        current = current->left;    /* 左子树      */
  65.  }
  66.  else
  67.  {
  68.     if ( current->right == NULL ) /* 是否是最右的子节点 */
  69.     {
  70.        current->right = temp; /* 接起父子的链结     */
  71.        inserted = 1;          /* 已经插入  */
  72.     }
  73.     else
  74.        current = current->right;   /* 右子树      */
  75.  }
  76.       }
  77.    }
  78. }
  79. /* ---------------------------------------- */
  80. /*  成员函数: 二元搜寻树的搜寻              */
  81. /* ---------------------------------------- */
  82. int binaryTree::search(int d)
  83. {
  84.    node *temp = head;
  85.    while ( temp != NULL )        /* 主回路             */
  86.    { 
  87.       if ( temp->data == d )     /* 找到了             */
  88.  return 1;
  89.       if ( temp->data < d )      /* 比较资料           */
  90.  temp = temp->right;     /* 右子树             */
  91.       else
  92.  temp = temp->left;      /* 左子树             */
  93.    }
  94.    return 0;                     /* 没有找到           */
  95. }   
  96. /* ---------------------------------------- */
  97. /*  成员函数: 中序走访列印二元树            */
  98. /* ---------------------------------------- */
  99. void binaryTree::printTree()
  100. {
  101.    inorder(head);                 /* 呼叫中序走访函数  */ 
  102. /* ---------------------------------------- */
  103. /*  主程式: 建立二元树且用中序走访列印出来. */
  104. /* ---------------------------------------- */
  105. void main()
  106. {
  107.    binaryTree btree;              /* 建立二元树物件     */
  108.    int i;
  109.    /* 二元树节点资料 */
  110.    int data[9] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 };
  111.    for ( i = 0; i < 9; i++ )      /* 用回路建立树状结构 */
  112.        btree.insertNode(data[i]); /* 插入二元树的节点   */
  113.    cout << "树的节点内容 n";
  114.    btree.printTree();             /* 中序走访二元树     */
  115.    cout << "n请输入搜索的数字: ";/* 输出数字           */
  116.    cin >> i;                      /* 输入数字           */
  117.    if ( btree.search(i) )         /* 搜寻输入的数字     */
  118.       cout << "找到节点! n";
  119.    else
  120.       cout << "没有找到节点! n";
  121. }