二叉树的操作(一)

二叉树的查找

二叉树也有两种查找方式,一种是基于数据元素值的查找和基于结点的查找,之前说过通用树结构的查找,一样也是一个递归调用的过程,递归公式如下图所示
值查找的递归公式
在这里插入图片描述
基于值的查找

virtual BTreeNode<T>* find(BTreeNode<T>* node,const T& value)const
{
    BTreeNode<T>* ret = NULL;
    if(node!=NULL)
    {
      if(node->value == value)
      {
         ret = node;
      }
      else
      {
          if(ret == NULL)
          {
             ret = find(node->l_pointer,value);
          }
          if(ret == NULL)
          {
             ret = find(node->r_pointer,value);
          }

      }
    }
   return ret;
}

结点查找的递归公式
在这里插入图片描述
基于结点的查找

  virtual BTreeNode<T>* find(BTreeNode<T>* node,BTreeNode<T>* obj)const
{
    BTreeNode<T>* ret = NULL;
    if(node!=NULL)
    {
      if(node == obj)
      {
         ret = node;
      }
      else
      {
          if(ret == NULL)
          {
             ret = find(node->l_pointer,obj);
          }
          if(ret == NULL)
          {
             ret = find(node->r_pointer,obj);
          }

      }
    }
   return ret;
}

二叉树的插入操作

二叉树也有插入新结点和插入数据元素的两种操作,二叉树的插入操作我们需要考虑的问题就是
1.是否能够在二叉树的任意结点处插入子结点
2.是否需要指定新数据元素的插入位置
对于第一个问题很显然是不能够的,对于二叉树里面的每个成员是相对固定的,假设我们要插入结点的父节点已经有左右孩子两个结点那么插入就会失败,这与通用树有所不同,通用树可以有任意多个子节点
对于第二个问题答案是肯定的,我们需要是插入父节点的左节点还是右节点,我们可以定义一个枚举类型表示位置

enum BTNodePos
{
   ANY,//任意位置
   LEFT,//左孩子处
   RIGHT//右孩子处
};

插入新结点

插入的代码

 bool insert(BTreeNode<T>* n,BTreeNode<T>* np,BTNodePos pos)
 {
    bool ret = true;
    if(pos==ANY)
    {
        if(np->l_pointer == NULL)
        {
            np->l_pointer = n;
        }
        else if(np->r_pointer == NULL)
        {
            np->r_pointer = n;
        }
        else
        {
            ret = false;
        }
    }
    else if(pos == LEFT)
    {
        if(np->l_pointer == NULL)
        {
          np->l_pointer  = n;
        }
        else
        {
           ret = false;
        }
    }
    else if(pos == RIGHT)
    {
        if(np->r_pointer == NULL)
        {
          np->r_pointer  = n;
        }
        else
        {
           ret = false;
        }
    }
    else
    {
       ret = false;
    }

   return false;
}

插入新结点的流程如下图所示
在这里插入图片描述
上述流程图的代码

 virtual bool insert(TreeNode<T>* node,BTNodePos pos)
{
   bool ret = true;
   if(node!=NULL)
   {
       if(this->m_root == NULL)
       {
           node->parent = NULL;
           this->m_root       = node;
       }
       else
       {
           BTreeNode<T>* np = find(node->parent);
           if(np!=NULL)
           {
               ret = insert(dynamic_cast<BTreeNode<T>*>(node),np,pos);
           }
           else
           {
               THROW_EXCEPTION(InvalidParamterException,"np == NULL......");
           }
       }
   }
   else
   {
       THROW_EXCEPTION(InvalidParamterException,"node == NULL.....");
   }
}

插入新数据

插入新数据元素的流程图
在这里插入图片描述
代码

 bool insert(const T& value,TreeNode<T>* parent)
 {
   return insert(value,parent,ANY);
 }
 virtual bool insert(const T& value,TreeNode<T>* parent,BTNodePos pos)
{
    bool ret = true;
    BTreeNode<T>* node = BTreeNode<T>::NewNode();
    if(node==NULL)
    {
        THROW_EXCEPTION(NoEnougMemoryException,"No memory to create new node....");
    }
    else
    {
        node->parent = parent;
        node->value  = value;
        ret = insert(node,pos);
        if(!ret)
        {
          delete node;
        }
    }
    return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值