博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
复习二叉搜索树作的几道题
阅读量:6209 次
发布时间:2019-06-21

本文共 5333 字,大约阅读时间需要 17 分钟。

// FindTree2.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

 

#include  <iostream>

#include "stdafx.h"

 

using  namespace  std;

typedef   struct  _TreeNode
{
 char    data;
 _TreeNode*  lChild;
 _TreeNode*  rChild;
}TreeNode,*PTreeNode;

void  PreWalk(TreeNode*  p)
  {
    if(p == NULL) return;
    cout<< p->data <<endl;
    if(p->lChild != NULL)
       cout<< "left of "<<p->data<<endl;
    PreWalk( p->lChild);
    if( p->rChild != NULL)
       cout<< "righ of " <<p->data<<endl;
    PreWalk(p->rChild);
  }

  void  InWalk(TreeNode*  p)

  {
   if(p == NULL) return;

   if(p->lChild != NULL)

     cout<< "left of "<<p->data<<endl;
   InWalk( p->lChild);

   cout<<p->data<<endl;

   if( p->rChild != NULL)

     cout<< "righ of " <<p->data<<endl;
    InWalk(p->rChild);
  }

  void  PostWalk(TreeNode*  p)

  {
    if(p == NULL) return;

    if(p->lChild != NULL)

     cout<< "left of "<<p->data<<endl;  
    PostWalk( p->lChild);

    if( p->rChild != NULL)

     cout<< "righ of " <<p->data<<endl;
    PostWalk(p->rChild);

    cout<<p->data<<endl;

  }

  void   InsertFindTree2(char data,TreeNode**  pTree)
  {
   if( *pTree == NULL  )
   {
    TreeNode*  pNode = new  TreeNode;
    pNode->data = data;
    *pTree = pNode;
    pNode->lChild = pNode->rChild= NULL;
   }
   else if( data < (*pTree)->data )
   {
   InsertFindTree2(data,&(*pTree)->lChild);
   }
   else
   {
   InsertFindTree2(data,&(*pTree)->rChild);
   }
  }

 
  void   CreateFindTree2( TreeNode**  pTree)
  {
   while(true)
   {
    char  c;
    cout<<"Value:\n"<<endl;
    cin>>c;
    if( c == '$' )
    {
     break ;//结束 
    }
    else
    {
        InsertFindTree2( c,pTree);
    }
   }
  }

  //

 TreeNode*   FindTreeNode2( char  data,TreeNode** pTree)
 {
   TreeNode*  pRetNode = NULL;
   if( data == (*pTree)->data )
   {
    pRetNode = *pTree;
   }
   else if( data < (*pTree)->data )
   {
    pRetNode = FindTreeNode2(data,&(*pTree)->lChild);
   }
   else
   {
    pRetNode = FindTreeNode2(data,&(*pTree)->rChild);
   }
   return  pRetNode;
 }

  //寻找前驱结点
 TreeNode*   FindPreTreeNode2( TreeNode* pNode)
 {
   TreeNode*  pRetNode = NULL;
   if( pNode->lChild == NULL  )
   {
    return NULL;
   }
   else if( pNode->lChild->rChild == NULL)
   {
    pRetNode = pNode->lChild;
   }
   else
   {
    pRetNode =  FindPreTreeNode2( pNode->lChild->rChild );
   }
   return  pRetNode;
 }

 
  //寻找后继结点
 TreeNode*   FindPostTreeNode2( TreeNode* pNode)
 {
   TreeNode*  pRetNode = NULL;
   if( pNode->rChild == NULL  )
   {
    return NULL;
   }
   else if( pNode->rChild->lChild == NULL)
   {
    pRetNode = pNode->rChild;
   }
   else
   {
    pRetNode =  FindPostTreeNode2( pNode->rChild->lChild );
   }
   return  pRetNode;
 }

  bool   DeleteFindTree2(char  data ,TreeNode*  parentNode, TreeNode** pTree)

  {
   bool   bDelete = false;

   if( *pTree == NULL)

    return  false;

   if( data == (*pTree)->data )

   {
    TreeNode*  delNode = *pTree;
    if( parentNode == NULL)
    {
     if( ((*pTree)->lChild != NULL) && ((*pTree)->rChild == NULL ))
     {
      *pTree = (*pTree)->lChild;
     }
     else if( ((*pTree)->rChild != NULL) && ((*pTree)->lChild == NULL ))
     {
      *pTree = (*pTree)->rChild;
     }
     else if( ((*pTree)->lChild != NULL) && ((*pTree)->rChild != NULL ))
     {
      //找*pTree的后继节点(可能是一个叶节点,也可能是没一个没有左孩子的节点)
      TreeNode  *pPostNode = (*pTree)->rChild,*pParentOfPost = NULL;
      while( pPostNode != NULL)
      {
       if( pPostNode->lChild == NULL)
        break;
       pParentOfPost = pPostNode;
       pPostNode = pPostNode->rChild ;
      }

      //先把左孩子挂到后继左孩子

      pPostNode->lChild = (*pTree)->lChild;

      //如果后继不是右孩子

      if( pPostNode != (*pTree)->rChild )
      {
       //把后继右孩子挂到后继的父节点上(后继一定没有左孩子,其必为父节点的左孩子)
       pParentOfPost->lChild = pPostNode->rChild;
      }
      *pTree = pPostNode;
     }
     else
     {
      *pTree = NULL;
     }

     delete  delNode;

    }
    else
    {
     if( parentNode->lChild == *pTree )
     {
      if( ((*pTree)->lChild != NULL) && ((*pTree)->rChild == NULL ))
      {
       parentNode->lChild  = (*pTree)->lChild;
      }
      else if( ((*pTree)->rChild != NULL) && ((*pTree)->lChild == NULL ))
      {
       parentNode->lChild = (*pTree)->rChild;
      }
      else if( ((*pTree)->lChild != NULL) && ((*pTree)->rChild != NULL ))
      {
       //找*pTree的后继节点(可能是一个叶节点,也可能是没一个没有左孩子的节点)
       TreeNode  *pPostNode = (*pTree)->rChild,*pParentOfPost = NULL;
       while( pPostNode != NULL)
       {
        if( pPostNode->lChild == NULL)
         break;
        pParentOfPost = pPostNode;
        pPostNode = pPostNode->rChild ;
       }

       //先把左孩子挂到后继左孩子

       pPostNode->lChild = (*pTree)->lChild;

       //如果后继不是右孩子

       if( pPostNode != (*pTree)->rChild )
       {
        //把后继右孩子挂到后继的父节点上(后继一定没有左孩子,其必为父节点的左孩子)
        pParentOfPost->lChild = pPostNode->rChild;
       }
       parentNode->lChild = pPostNode;
      }
      else
      {
        parentNode->lChild  = NULL;
      }

      delete  delNode;

     }
     else if( parentNode->rChild == *pTree )
     {
       if( ((*pTree)->lChild != NULL) && ((*pTree)->rChild == NULL ))
      {
       parentNode->rChild  = (*pTree)->lChild;
      }
      else if( ((*pTree)->rChild != NULL) && ((*pTree)->lChild == NULL ))
      {
       parentNode->rChild = (*pTree)->rChild;
      }
      else if( ((*pTree)->lChild != NULL) && ((*pTree)->rChild != NULL ))
      {
       //找*pTree的后继节点(可能是一个叶节点,也可能是没一个没有左孩子的节点)
       TreeNode  *pPostNode = (*pTree)->rChild,*pParentOfPost = NULL;
       while( pPostNode != NULL)
       {
        if( pPostNode->lChild == NULL)
         break;
        pParentOfPost = pPostNode;
        pPostNode = pPostNode->rChild ;
       }

       //先把左孩子挂到后继左孩子

       pPostNode->lChild = (*pTree)->lChild;

       //如果后继不是右孩子

       if( pPostNode != (*pTree)->rChild )
       {
        //把后继右孩子挂到后继的父节点上(后继一定没有左孩子,其必为父节点的左孩子)
        pParentOfPost->lChild = pPostNode->rChild;
       }
       parentNode->rChild = pPostNode;
         }
      else
      {
        parentNode->rChild  = NULL;
      }
      delete  delNode;
    }
  }

    bDelete = true;

   }
   else if( data < (*pTree)->data )
   {
     bDelete = DeleteFindTree2(data,*pTree,&(*pTree)->lChild);
   }
   else
   {
     bDelete = DeleteFindTree2(data,*pTree,&(*pTree)->rChild);
   }

   return   bDelete;

  }

 

int _tmain(int argc, _TCHAR* argv[])
{
   TreeNode*   _root = NULL;
   CreateFindTree2(&_root);

   PreWalk( _root );

      if( DeleteFindTree2('3',NULL,&_root))

   {
    cout<<" delete ok!\n"<<endl;
   }
   else
   {
    cout<<" can not find this node !\n"<<endl;
   }

    PreWalk( _root);

    return 0;

}

 

转载地址:http://wpbja.baihongyu.com/

你可能感兴趣的文章
由浅入深探究mysql索引结构原理、性能分析与优化
查看>>
最新破解
查看>>
2010年度报告:是谁在编写Linux内核?
查看>>
关于python文件操作
查看>>
fmplan主页功能设计第一阶段成果
查看>>
Nodejs初阶之express
查看>>
Android--List与ArrayList区别(转)
查看>>
【转】如何在Mac 终端升级ruby版本
查看>>
机器学习算法基础(Python和R语言实现)
查看>>
Word中的“编辑>选择性粘贴>无格式文本”的快捷键
查看>>
MySql my.ini 中文详细说明
查看>>
ASP.NET MVC 超简单 分页
查看>>
ASP.NET 动态编译、预编译和 WebDeployment 项目
查看>>
vs2005 c#鼠标悬停高亮显示在gridview中
查看>>
继续聊WPF——动态数据模板
查看>>
如何使员工能力和收入相匹配?
查看>>
程序出现这样的问题,到底是谁的责任?
查看>>
配置CVS服务器和客户端完全解析
查看>>
Qt的QFile类详解
查看>>
假如我是个程序员
查看>>