二叉树的前序、中序、后序遍历 查找 删除

来源:互联网 发布:网络致富平台 编辑:程序博客网 时间:2024/06/07 14:56

(二叉树的删除)在本练习中,我们讨论从二叉查找树删除节点问题。删除算法不像插入算法那么简单明了。删除一个值可能有三种不同的情况————该值包含在一个叶子节点中(没有子节点),该值包含在只有一个子节点中或者包含在两个子节点的节点中。
如果该项在叶节点中,直接删除该节点,将其父节点指向它的指针置为空。
如果该项包含在只含一个子节点的节点中,把父节点的指针指向它的子节点再删除这个数据项,就是由它的子节点替代该节点的位置。最后一种情况是最难的。当要删除的节点含有2个子节点时,由另一个叶子节点代替它的位置

编写一个二叉树的成员函数deleteNode,以树的根节点指针和要删除的值为参数。该函数需要找到包含该值的节点,使用上面讨论的算法将该节点删除。该函数还要打印一条信息以表明该节点被删除。当删除完成后,使用中序、前序和后序遍历来确认该节点是否已被正确删除。

///////////////////////////////////////////////////BinSTree.h//////////////////////////////////////////////////

#pragma once
#include <iostream>
#include <stdio.h>
using namespace std;
class BinSTree;
class TreeNode
{
public:
         friend class BinSTree;
         TreeNode(char item, TreeNode *lptr = NULL, TreeNode *rptr = NULL                            ):contents(item),left(lptr),right(rptr){ }
private:
         char contents;         //节点值
         TreeNode *left;         //左孩子
         TreeNode *right;        //右孩子
};
typedef TreeNode* LPTreeNode;
class BinSTree
{
public:
         BinSTree(void);
         ~BinSTree(void);
         void CreatBinSTree(LPTreeNode &tree);   //创建新树
         void MiddleRead(TreeNode *t);     //中序遍历

         void FirstRead(TreeNode *t);     //前序遍历
          void LastRead(TreeNode *t);      //后序遍历
         void Find(TreeNode *tree,char i);    //查找是否存在值为i的节点
         LPTreeNode Search(LPTreeNode &tree);     //
         void DeleteNode(LPTreeNode &tree,char i); //删除值为i的节点
         TreeNode *node;         //根节点
private:
         bool tj;
};

////////////////////////////////////////BinSTree.cpp/////////////////////////////////////////////

#include "BinSTree.h"
BinSTree::BinSTree(void)
{
         tj=false;
}

BinSTree::~BinSTree(void)
{

}
void BinSTree::CreatBinSTree(LPTreeNode &tree)
{
         char c;
         scanf("%c",&c);         //获得一个节点值
         if(c==' ')
         {
                  tree = NULL;
         }
         else
         {
                  tree = new TreeNode(c);      //生成一个新节点
                  CreatBinSTree(tree->left);     //生成左子树
                  CreatBinSTree(tree->right);     //生成右子树
         }
}
void BinSTree::MiddleRead(TreeNode *t)
{
         if(node == NULL)
         {
                  cout<<"空树,无法遍历!"<<endl;
                  return;
         }
         if(t!=NULL)
         {
                  MiddleRead(t->left);
                  cout<<t->contents<<" ";
                  MiddleRead(t->right);
          }
}
void BinSTree::FirstRead(TreeNode *t)
{
         if(node == NULL)
         {
                  cout<<"空树,无法遍历!"<<endl;
                  return;
         }
         if(t!=NULL)
         {
                  cout<<t->contents<<" ";
                  MiddleRead(t->left);
                  MiddleRead(t->right);
         }
}
void BinSTree::LastRead(TreeNode *t)
{
         if(node == NULL)
         {
                  cout<<"空树,无法遍历!"<<endl;
                  return;
         }
         if(t!=NULL)
         {
                  MiddleRead(t->left);
                  MiddleRead(t->right);
                  cout<<t->contents<<" ";
         }
}
void BinSTree::Find(TreeNode *tree,char i)
{
         if(tree!=NULL)
         {
                  if(tree->contents==i)
                  {
                           tj=true;
                           return;
                  }
                  if(tree->left!=NULL)
                  {
                           if(tree->left->contents == i)
                           {
                                    tj=true;
                                    return;
                           }
                  }
                  if(tree->right!=NULL)
                  {
                           if(tree->right->contents == i)
                           {
                                    tj=true;
                                    return;
                           }
                  }
         Find(tree->left,i);
         Find(tree->right,i);
         }
}
LPTreeNode BinSTree::Search(LPTreeNode &tree)
{
         if(tree!=NULL)
         { 
                  if(tree->left->left==NULL && tree->left->right==NULL)
                  {
                           return tree->left;
                   }
         else if(tree->right->left==NULL && tree->right->right==NULL)
         {
                  return tree->right;
         }
         return Search(tree->left);
         return Search(tree->right);
         }
}

 
 
 
二叉树删除节点(二)
2008-05-01 10:13
void BinSTree::DeleteNode(LPTreeNode &tree,char i)
{
         Find(tree,i);
         if(!tj)
         {
                  cout<<"无此节点!"<<endl;
                  return;
         }
         if(tree!=NULL)
         {
                  if(node->contents == i)
                  {
                           if(node->left == NULL && node->right == NULL)
                           {
                                    delete node;
                                    node=NULL;
                                     cout<<"已删除节点,当前树为空"<<endl;
                                    return;
                           }
                           else if(node->left != NULL && node->right == NULL)
                           {
                                    TreeNode *p = node;
                                    TreeNode *d = new TreeNode(Search(node)->contents);
                                    d->left = tree->left;
                                    d->right = NULL;
                                     node = d;
                                    delete p;
                                    cout<<"值为"<<i<<"的节点已被删除"<<endl;
                           }
                            else if(node->right != NULL && node->left == NULL)
                           {
                                    TreeNode *p = node;
                                    TreeNode *d = new TreeNode(Search(node)->contents);
                                    d->left = NULL;
                                    d->right = tree->right;
                                    node = d;
                                    delete p;
                                    cout<<"值为"<<i<<"的节点已被删除"<<endl;
                           }
                           else
                            {
                                    TreeNode *p = node;
                                    TreeNode *d = new TreeNode(Search(node)->contents);
                                    d->left = tree->left;
                                     d->right = tree->right;
                                     node = d;
                                    delete p;
                                    cout<<"值为"<<i<<"的节点已被删除"<<endl;
                            }
                  }
                   if(tree->left!=NULL)
                   {
                           if(tree->left->contents == i)
                           {
                                    if(tree->left->left == NULL && tree->left->right != NULL)
                                    {
                                             TreeNode *p = tree->left;
                                              tree->left = tree->left->right;
                                             delete p;
                                             cout<<"值为"<<i<<"的节点已被删除"<<endl;
                                    }
                                    else if(tree->left->left == NULL && tree->left->right == NULL)
                                    {
                                             delete tree->left;
                                             tree->left = NULL;
                                             cout<<"值为"<<i<<"的节点已被删除"<<endl;
                                    }
                                    else if(tree->left->left != NULL && tree->left->right == NULL)
                                     {
                                             TreeNode *p = tree->left;
                                             tree->left = tree->left->left;
                                             delete p;
                                             cout<<"值为"<<i<<"的节点已被删除"<<endl;
                                    }
                                    else if(tree->left->left != NULL && tree->left->right != NULL)
                                     {
                                             TreeNode *p = tree->left;
                                             TreeNode *d = new TreeNode(Search(node)->contents);
                                             d->left = tree->left->left;
                                             d->right = tree->left->right;
                                            tree->left = d;
                                             delete p;
                                    }
                                    return;
                           }
                  }
                   if(tree->right!=NULL)
                  {
                           if(tree->right->contents == i)
                           {
                                    if(tree->right->left == NULL && tree->right->right == NULL)
                                    {
                                             delete tree->right;
                                             tree->right = NULL;
                                             cout<<"值为"<<i<<"的节点已被删除"<<endl;
                                    }
                                    else if(tree->right->left != NULL && tree->right->right == NULL)
                                    {
                                             TreeNode *p = tree->right;
                                              tree->right = tree->right->left;
                                             delete p;
                                             cout<<"值为"<<i<<"的节点已被删除"<<endl;
                                    }
                                    else if(tree->right->left == NULL && tree->right->right != NULL)
                                    {
                                             TreeNode *p = tree->right;
                                             tree->right = tree->right->right;
                                             delete p;
                                             cout<<"值为"<<i<<"的节点已被删除"<<endl;
                                     }
                                    else if(tree->right->left != NULL && tree->right->right != NULL)
                                    {
                                             TreeNode *p = tree->right;
                                             TreeNode *d = new TreeNode(Search(node)->contents);
                                              d->left = tree->right->left;
                                             d->right = tree->right->right;
                                             tree->right = d;
                                             delete p;
                                     }
                                    return;
                           }
                  }
                  DeleteNode(tree->left,i);
                  DeleteNode(tree->right,i);
         }

原创粉丝点击