zoukankan      html  css  js  c++  java
  • 删除二叉排序树的结点

    有两个方法

    法一:找到需要删除的结点后,用左子树最大的结点代替

    void DeleteNode(BiTree &root,KeyType x){
        if(root == NULL){
            return;
        }
        if(root->key>x){
            DeleteNode(root->lchild,x);//遍历到的结点值比所给值大,就需要遍历左子树
        }else if(root->key<x){
            DeleteNode(root->rchild,x);//遍历到的结点值比所给值小,就需要遍历右子树
        }else{ //查找到了删除节点
            //左或者右结点为空只需要将剩下的右或者左子树换上去
            if(root->lchild == NULL){ //左子树为空
                BiTree tempNode = root;
                root = root->rchild;
                free(tempNode);
            }else if(root->rchild == NULL){ //右子树为空
                BiTree tempNode = root;
                root = root->lchild;
                free(tempNode);
            }else{//左右子树都不为空
                //一般的删除策略是左子树的最大数据 或 右子树的最小数据 代替该节点
                //(这里采用查找左子树最大数据来代替,最大是在左子树的最右那个节点
                BiTree tempNode = root->lchild;//找左子树
                if(tempNode->rchild!=NULL){
                    tempNode = tempNode->rchild;//找左子树的右子树
                }
                root->key = tempNode->key;//将右子树的值赋给需要删除的那结点
                DeleteNode(root->lchild,tempNode->key);//删除右子树
    
                
            }
        }
    }

    法二 找右子树最小的来代替,然后再删除那个小的

    //与上面代码不同的地方
    BiTree tempNode = root->rchild;
                if(tempNode->lchild!=NULL){
                    tempNode = tempNode->lchild;
                }
                root->key = tempNode->key;
                DeleteNode(root->rchild,tempNode->key);
  • 相关阅读:
    NHibernate OR EES ,不能比较的比较
    Dubbo实现原理和实现机制
    xxljob学习1:整体架构
    xxljob学习2:用户端注册
    xxljob学习4:任务调度器
    xxljob学习3:服务端一次调度
    jQuery源码学习(1)——addClass
    jQuery 选择器项目实例
    javascript权威指南读书笔记(1)——对象
    easyui tabs源码阅读(未完待续)
  • 原文地址:https://www.cnblogs.com/zyqx/p/9530824.html
Copyright © 2011-2022 走看看