二叉树的操作

Posted 勇士后卫头盔哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的操作相关的知识,希望对你有一定的参考价值。

二叉树的查找

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

基于值的查找

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;

以上是关于二叉树的操作的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的基本运算

链式二叉树的基本操作(建议收藏!!!)

二叉树的建立及基本操作

利用JAVA语言,将二叉树封装在一个类中,要求实现二叉树的构造,并实现二叉树的遍历操作。

二叉树的操作

二叉树的操作