zoukankan      html  css  js  c++  java
  • Leetcode450. 删除二叉搜索树中的节点

    思路:

    (1)如果root为空,返回

    (2)如果当前结点root是待删除结点:

             a:root是叶子结点,直接删去即可

        b:root左子树不为空,则找到左子树的最大值,即前驱结点,使用前驱结点代替待删除的root结点值,并在root的左子树中,继续删除前驱结点

        c:root右子树不为空,则找到右子树的最大值,即后继结点,使用后继结点代替待删除的root结点值,并在root的右子树中,继续删除后继结点

    (3)如果待删除值大于root->val,则在右子树中继续删除待删除值

    (4)如果待删除值小于root->val,则在左子树中继续删除待删除值

    void deleteTreeNode(TreeNode* &root,int key)//使用引用,以可以直接改变原树的结点
    {
        if(root==NULL) return;
        if(root->val==key)
        {
            if(!root->left && !root->right)
            {
                root=NULL;
            }
            else if(root->left)//左子树不空就优先左子树吧
            {
                //找左子树的最大元素,,即找到前驱结点
                TreeNode* cur=root->left;
                while(cur->right)
                    cur=cur->right;
                root->val=cur->val;//使用前驱结点覆盖目标结点,并在目标结点的左子树中删除前驱结点
                deleteTreeNode(root->left,cur->val);
            }
            else if(root->right)//右子树不空就优先左子树吧
            {
                //找右子树的最大元素,,即找到后继结点
                TreeNode* cur=root->right;
                while(cur->left)
                    cur=cur->left;
                root->val=cur->val;//使用后继结点覆盖目标结点,并在目标结点的右子树中删除后继结点
                deleteTreeNode(root->right,cur->val);
            }
        }
        else if(key < root->val)
        {
            deleteTreeNode(root->left,key);
        }
        else if(key > root->val)
        {
            deleteTreeNode(root->right,key);
        }
    }

    要注意,上面递归的过程中使用的是root的引用,因为是要直接删除结点,而不是改变结点中的值。

  • 相关阅读:
    手机浏览器的viewport(视觉窗口)
    google开源了google chrome android
    Yii 直接执行SQL语句(转)
    WebKit学习网址收集
    Yii CDbCriteria的常用方法
    现货黄金入门知识普及一:图形分析之K线理论
    java 获取当前函数名
    yii url生成
    android 判断屏幕是否关闭
    yii yiiplayground
  • 原文地址:https://www.cnblogs.com/renzmin/p/12003607.html
Copyright © 2011-2022 走看看