zoukankan      html  css  js  c++  java
  • 排序二叉树(转)

    排序二叉树的性质如下:

    若他的左子树不空,则左子树上所有的结点均小于它的根结点的值。

    若他的右子树不空,则右子树上所有的结点均大于它的根结点的值。

    他的左右子树也是排序二叉树。

    代码:

    #include <iostream>
    using namespace std;

    struct node{ //树的节点
     int Value;
     node *left;
     node *right;
    };

    //中序遍历
    void circle(node *p)
    {
     if(NULL == p)
      return;
     circle(p->right);
     cout << p->Value << ' ';
     circle(p->left);
    }

    //树类
    class Tree{
    public:
     Tree(){head = NULL;}  //构造函数
     void Create(int [], int); //创建二叉排序树
     void add(int);    //增加
     void del(int);    //删除
     void Output();    //输出
    private:
     node *head;        //根节点
     int Length;        //总长度
    };

    //创建二叉排序树
    void Tree::Create(int number[], int Length_array)
    {
     
     node *p  = new node;
     p->Value = number[0];
     p->left  = NULL;
     p->right = NULL;

     head = p;

     Length = Length_array;

     //后面的数据
     for(int i = 1; i < Length_array; i++)
     {
      node *q = new node;
      q->Value = number[ i];
      q->left  = NULL;
      q->right = NULL;

      p = head;
      node *t = p;
      int count; //判别是左还是右节点

      while(p != NULL)
      {
       t = p;
       if(q->Value > p->Value)
       {
        p = p->right;
        count = 1;
        continue;
       }

       if(q->Value < p->Value)
       {
        p = p->left;
        count = 0;
       }
      }
      if(count)
       t->right = q;
      else
       t->left  = q;
     }
    }

    //增加
    void Tree::add(int N)
    {
     node *q = new node;
     q->Value = N;
     q->left  = NULL;
     q->right = NULL;

     node *p = head;
     node *t = p;
     int count;

     while(p != NULL)
     {
      t = p;
      if(q->Value > p->Value)
      {
       p = p->right;
       count = 1;
       continue;
      }

      if(q->Value < p->Value)
      {
       p = p->left;
       count = 0;
       continue;
      }
      if(q->Value == p->Value)
      {
       cout << "THE NUMBER IS EXIST!" << endl;
       return;
      }
     }
     if(count)
      t->right = q;
     else
      t->left  = q;

     Length++;
    }

    void Tree::del(int N)
    {
     node *p = head;
     node *t = p;
     int count;

     while(p != NULL)
     {
      if(N > p->Value)
      {
       t = p;
       p = p->right;
       count = 1;
       continue;
      }

      if(N < p->Value)
      {
       t = p;
       p = p->left;
       count = 0;
       continue;
      }
      if(N == p->Value)
      {
       break;
      }
     }

     //没有要删的节点
     if(NULL == p)
     {
      cout << "NO ELEMENT!" << endl;
      return;
     }

     int sign = 0; //如果删除的是根节点
     if(p == head)
      sign = 1;

     //删除的是叶子节点
     if(p->left == NULL && p->right == NULL)
     {
      if(sign) //根节点
      {
       head = NULL;
       delete(p);
       return;
      }
      if(count)
       t->right = NULL;
      else
       t->left  = NULL;

      delete(p);

      return;
     }

     //只有右节点
     if(p->left == NULL && p->right != NULL)
     {
      if(sign) //根节点
      {
       head = p->right;
       delete(p);
       return;
      }

      if(count)
      {
       t->right = p->right;
      }
      else
      {
       t->left  = p->right;
      }

      delete(p);
      return;
     }

     //只有左节点
     if(p->right == NULL && p->left != NULL)
     {
      if(sign)
      {
       head = p->left;
       delete(p);
       return;
      }

      if(count)
       t->right = p->left;
      else
       t->left  = p->left;

      delete(p);
      return;
     }
     
     //两边都有
     if(count && !sign)
      t->right = p->left;
     else if(!sign)
      t->left  = p->left;

     node *next = p->left;
     while(next->right != NULL)
      next = next->right;

     next->right = p->right;

     if(sign)
      head = p->left;

     delete(p);
    }
    //输出
    void Tree::Output()
    {
     node *p = head;
     if(NULL == p)
     {
      cout << "NO ELEMENT" << endl;
      return;
     }
     circle(p);
     cout << endl;
    }

    //测试数据
    int main()
    {
     Tree tree;
     int num[10] = {12, 45, 24, 57, 23, 232, 1111, 1, 34, 2};
     tree.Create(num, 10);       //创建树
     tree.Output();

     tree.add(123);      //增加数
     tree.add(0);
     tree.Output();

     tree.del(23);       //删除叶子节点
     tree.del(1111);    
     tree.del(123);
     tree.Output();
     tree.del(232);
     tree.del(2);
     tree.Output();

     tree.del(2);        //删除不存在的节点

     tree.del(24);       //删除度为1的节点
     tree.Output();
     tree.del(1);
     tree.Output();

     tree.add(21); 
     tree.add(21);       //重复加数

     tree.add(35);
     tree.add(46);
     tree.add(90);
     tree.Output();

     tree.del(57);       //删除度为2的节点
     tree.Output();

     tree.del(12);       //删除根节点
     tree.Output();

     return 0;
    }

  • 相关阅读:
    jQuery中常用方法和jQuery思维导图
    jQuery
    JS-AJAX and jQuery-AJAX
    Linux系统里导入maven项目
    maven项目里的ssh框架整合
    spring框架的两大核心:IOC和AOP
    JAVA的抽象类和接口
    JAVA面向对象的三大特征
    JAVA---面向对象
    JAVA---方法
  • 原文地址:https://www.cnblogs.com/heyp/p/3782932.html
Copyright © 2011-2022 走看看