zoukankan      html  css  js  c++  java
  • 关于删除树中指定节点的实例分析

    Tree *Delete(Tree *T,int n)
    {
        //将树中指定节点删除的函数
        Tree *tmp;
        if(T==NULL)
            return NULL;
        if(T->element==n)
        {
            if(T->right==NULL)                       //如果没有右子树,即只有一个该节点儿子左子树
            {                                        //则直接删除
                tmp=T;
                T=T->left;                            //用左子树节点代替父节点
                free(tmp);
            }
            else                                     //如果右子树存在
            {
                tmp=T->right;
                while(tmp->left!=NULL)
                    tmp=tmp->left;                   //找到右子树的值最小的节点
                T->element=tmp->element;             //用该节点的值代替原来的节点的值
                T->right=Delete(T->right,tmp->element);                         //递归的删除右子树中用来代替源节点值的节点
                T->height = MAX(Height(T->left),Height(T->right)) + 1;
            }
            return T;
        }
        if(n < T->element)
            T->left = Delete(T->left,n);
        else
            T->right = Delete(T->right,n);
        T->height = MAX(Height(T->left),Height(T->right)) + 1;
        return T;
    }


    下面以实例来解释,假设要删除下图的节点2,

    如图,要删除节点2,先看节点2有没有右子树;有右子树,找到其右子树中值最小的节点,于是找到了3;把3的值赋给节点2,现在变成第2附图;下面要递归的删除其右子树中的3节点。
    5比3大,所以left递归找到3;3有右子树4,所以要找到3的右子树的值最小的节点。4是其唯一的值,肯定是其最小的节点。于是把4赋给3,变成第3幅图;下面要删除4的右子树中给其赋值的节点4.第一个就是4,好巧,看看其有没有右子树,没有,光杆司令一个;直接删除该节点,把NULL赋给4;于是变成第4幅图。
  • 相关阅读:
    Android游戏开发研究与主角在地图滚动
    程序猿学一点金融知识,但是,如果没有提示代码
    Java8的日期和时间的库20经常使用的演示样本
    通用Key-Value存储系统的存储管理策略解析
    车库门开启器
    timesten备份和恢复
    HTML DOCTYPE 重要性
    嵌Ruby 2 《捆绑》
    Jexus web server V5.6.1正式公布
    卓尼斯ZT-180评測
  • 原文地址:https://www.cnblogs.com/CClarence/p/5159357.html
Copyright © 2011-2022 走看看