zoukankan      html  css  js  c++  java
  • 二叉搜索树

    #include <iostream>
    using namespace std;
    typedef struct TreeNode *SearchTree;
    typedef struct TreeNode *Position;
    struct TreeNode
    {
     int Element;
     SearchTree Left;
     SearchTree Right;
    };
    //////////////函数声明//////////////////////////
    void MakeEmpty(SearchTree T);  //清空一个树
    SearchTree CreatTree(int x);    //创建一个根为x的空树
    Position Find(int x, SearchTree T);     //查找函数
    Position FindMin(SearchTree T);         //寻找二叉树的最小值
    Position FindMax(SearchTree T);         //寻找二叉树的最大值
    SearchTree Insert(int x, SearchTree T);   //插入元素
    SearchTree Delete(int x, SearchTree T);    //删除元素
     //////////////函数定义//////////////////////////
    void MakeEmpty(SearchTree T)
    {
     if (T != NULL)
     {
      MakeEmpty(T->Left);
      MakeEmpty(T->Right);
      delete T;// free(T);//把最后的指向根结点的指针去掉。
     }

    }
    SearchTree CreatTree(int x)
    {
     SearchTree T;
     T = static_cast<SearchTree>(malloc(sizeof(struct TreeNode)));
     T->Element = x;//这是指二叉树的结点值
     T->Left = NULL;
     T->Right = NULL;
     return T;//T指向一颗二叉树
    }
    Position Find(int x, SearchTree T)
    {
     if (T == NULL)
     {
      return NULL;
     }
     if (x < T->Element)
     {
      return Find(x, T->Left);  //尾递归
     }
     else
     {
      if (x > T->Element)
      {
       return Find(x, T->Right);
      }
      else
      {
       return T;//这一步不可省略,处理相等的情况
      }
     }

    }
    Position FindMin(SearchTree T)
    {
     if (T == NULL)
     {
      return NULL;
     }
     else
     {
      if (T->Left == NULL)
      {
       return T;
      }
      else
      {
       return FindMin(T->Left);//递归方式找最小值
      }
     }
    }
    Position FindMax(SearchTree T)
    {
     if (T != NULL)
     {
      while (T->Right != NULL)
      {
       T = T->Right;//迭代方式找最大值
      }
     }
     return T;
    }
    SearchTree Insert(int x, SearchTree T)
    {
     if (T == NULL)//处理递归的初始条件
     {
      T = static_cast<SearchTree>(malloc(sizeof(struct TreeNode)));
      if (T == NULL)
      {
       cout << "out of space" << endl;
      }
      else
      {
       T->Element = x;
       T->Left = NULL;
       T->Right = NULL;
      }
     }
     else
     {
      if (x < T->Element)
      {
       T->Left = Insert(x, T->Left);//递归实现
      }
      else
      {
       if (x > T->Element)
       {
        T->Right = Insert(x, T->Right);//递归实现
       }
      }
     }
     return T;
    }
    SearchTree Delete(int x, SearchTree T)
    {
     Position TmpCell;
     if (T == NULL)
     {
      cout << "Element not found" << endl;
     }
     else
     {
      if (x < T->Element)
      {
       T->Left = Delete(x, T->Left);
      }
      else
      {
       if (x > T->Element)
       {
        T->Right = Delete(x, T->Right);
       }
       else   //此处找到了要删除的元素
       {
        if (T->Left && T->Right)    //如果这个节点有两个儿子
        {
         TmpCell = FindMin(T->Right);
         T->Element = TmpCell->Element;
         T->Right = Delete(T->Element, T->Right);
        }
        else    //一个儿子或者没有儿子
        {
         TmpCell = T;
         if (T->Left == NULL)
         {
          T = T->Right;

         }
         else
         {
          if (T->Right == NULL)
          {
           T = T->Left;
          }
         }
         free(TmpCell);
        }
       }
      }
     }
     return T;
    }
    int main()
    {
     //////////////测试//////////////////////
     SearchTree Tree_1 = CreatTree(6);//根结点为6
     Tree_1 = Insert(2, Tree_1);
     Tree_1 = Insert(8, Tree_1);
     Tree_1 = Insert(1, Tree_1);
     Tree_1 = Insert(4, Tree_1);
     Tree_1 = Insert(3, Tree_1);
     ///////////////上面的二叉树为////////////////////////////
    //  6           
    // /
    //   2   8
    //  /
    // 1   4
    // /
    //   3
     ///////////////////////////////////////////////////////
     cout << FindMax(Tree_1)->Element << endl;
     cout << FindMin(Tree_1)->Element << endl;
     cout << Find(2, Tree_1)->Right->Element << endl;//结点2的右下方元素
     MakeEmpty(Tree_1);
     return 0;
    }

  • 相关阅读:
    Knime 使用 初探
    MySql可视化工具MySQL Workbench使用教程
    MySQL导入sql 文件的5大步骤
    Import MySQL Dumpfile, SQL Datafile Into My Database
    导入已有的vmdk文件,发现网络无法连通
    VirtualBox镜像复制载入
    对自己说的话
    linux遇见的问题
    vbox下安装 linux 64 bit出现“kernel requires an x86_64 cpu
    Servlet 3 HttpServletRequest HttpServletResponse 验证码图片 form表单
  • 原文地址:https://www.cnblogs.com/Rakint/p/9796493.html
Copyright © 2011-2022 走看看