【问题标题】:Deleting a BinaryTreeNode from a BinaryTree从 BinaryTree 中删除 BinaryTreeNode
【发布时间】:2011-12-18 04:07:21
【问题描述】:

我有一个BinarySearchTree,它由节点组成,这些节点都是 dataType student 的模板类,其中 student 是一个具有 name 和 Grade 私有变量的类。

目前我可以打印树,在树中查找名称和/或等级,但我无法从树中删除节点。

我正在尝试删除所有成绩

删除节点后,需要发生以下情况之一:

  1. 左孩子为空:用右孩子替换节点。
  2. 左子不为空:用左边最高元素替换节点 分支。

我的理解是,如果这是树的话:

      1
     /  \
    2    3
   / \   /\
  4  5  6  7

如果 2 次失败,即成绩

你最终会得到

     1
    /  \
  4     3
   \    / \
    5  6  7

4 是左分支中的最高元素。

如果这是树:

     1
    /  \
   2     3
   \     / \
    5  6   7

2 次失败

你最终会得到

     1
    /  \
  5      3
        /  \
       6   7

如果这是树:

     1
    /  \
  2     3
 / \    / \
 4  5  6  7

1 次失败

你最终会得到

     5
    /  \
  2     3
 /      / \
4      6  7

我在尝试创建函数来执行此操作时遇到了很多麻烦,目前我有:

void checkBranch()  //called from main - used to pass the root node to checkBranch()
{
checkBranch(studentTree.getRoot());
}

bool checkBranch(BTNode<Student>* currentNode)
{
if (currentNode != NULL)
{
    if (checkBranch(currentNode -> getLeft()))
    {
        deleteNode(currentNode, true);
    }  

    if (checkBranch(currentNode -> getRight()))
    {
        deleteNode(currentNode, false);
    }

    return (currentNode -> getData().getGrade() < 50.0);
}

else
{
    return false;
}
}

现在我正在尝试添加 deleteNode 函数,我只是卡在该做什么/处理需要发生的事情上:

void deleteNode(BTNode<Student> *parentNode, bool left)
{
BTNode<Student>* nodeToDelete;

if (left)
{
    nodeToDelete = parentNode->getLeft();
}
}

【问题讨论】:

    标签: c++ memory-management tree binary-tree


    【解决方案1】:

    我设法做到了:

    template <typename dataType>
    void BTree<dataType>::deleteNode(BTNode<dataType> *parentNode, bool left)   
    {
        BTNode<dataType> *nodeToDelete;
        BTNode<dataType> *currentNode;
    
    if (left)
    {
        nodeToDelete = parentNode->getLeft();
    }
    
    else
    {
        nodeToDelete = parentNode->getRight();
    }
    
    if (nodeToDelete->getLeft() == NULL)
    {
        currentNode = nodeToDelete;
    
        if (left)
        {
            parentNode->setLeft(nodeToDelete->getRight());
        }
        else
        {
            parentNode->setRight(nodeToDelete->getRight());
        }
    
        delete nodeToDelete;
    }
    
    else
    {
        BTNode<dataType>* greatestNode = nodeToDelete->getLeft();
    
        if (greatestNode->getRight() == NULL)
        {
            nodeToDelete->getLeft()->setRight(nodeToDelete->getRight()); 
    
            if (left)
            {
                parentNode->setLeft(nodeToDelete->getLeft());
            }
            else
            {
                parentNode->setRight(nodeToDelete->getLeft());
            }
        }
    
        else
        {
            while (greatestNode->getRight()->getRight())
            {
                greatestNode = greatestNode->getRight();
            }
    
            nodeToDelete->setData(greatestNode->getRight()->getData());
    
            BTNode<dataType> *nodeToDelete2 = greatestNode->getRight();
    
            greatestNode->setRight(greatestNode->getRight()->getLeft());
    
            delete nodeToDelete2;
        }
    }
    }
    

    【讨论】:

      【解决方案2】:

      首先,您的checkBranch 有点错误。如果根节点无效怎么办?它不会被删除。我在这里建议一种更优雅的方式,使用可能像这样的回调方法:

      int deleteNodesOnCondition(BTNode<Student>* node, bool(* condition)(BTNode<Student>*))
      {
         int deleteCount = -1;
         if(condition != NULL)
         {
            deleteCount = 0;
            if(node != NULL)
            {
               deleteCount += deleteNodesOnCondition(node->getLeft(), condition);
               deleteCount += deleteNodesOnCondition(node->getRight(), condition);
      
               bool satisfied = condition(node);
               if(satified)
               {
                  deleteNode(node);
                  deleteCount += 1;
               }
            }
         }
         return deleteCount;
      }
      
      bool checkValidGrade(BTNode<Student> *node)
      {
         return node != NULL && node->getData().getGrade() >= 50.0;
      }
      
      void checkBranch()
      {
         deleteNodesOnCondition(studentTree.getRoot(), checkValidGrade);
      }
      

      对于delete 实现检查here where found == true。注意:此代码未经测试。

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 2021-05-27
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        相关资源
        最近更新 更多