二叉搜索树之递归

来源:互联网 发布:开淘宝零食店流程 编辑:程序博客网 时间:2024/06/05 08:55

上一篇写的是关于二叉搜索树的递归方法,这次就写一下非递归的方法吧。
首先是插入,递归的插入就非常简单了,先插入根节点,再判断是要插入左子树,还是右子树。
直接上代码吧。

bool Insert_Nor(const K& key, const V& value)    {        return _Insert(_pRoot, key, value);    }

因为要递归遍历,不能每次都往_pRoot根节点上插,所以需要重新写一个函数,将_pRoot作为参数传过去。

bool _Insert(Node* & pRoot, const K& key, const V& value)    {        if(pRoot == NULL)        {            pRoot = new Node(key, value);            return true;        }        if(pRoot->_key > key)            _Insert(pRoot->_pLeft, key, value);        else            _Insert(pRoot->_pRight, key, value);        return false;    }

递归查找:

Node* Find_Nor(const K& key)    {        return _Find(_pRoot, key);    }
Node* _Find(Node* pRoot, const K& key)    {        Node* pCur = pRoot;        if(pRoot)        {            if(pRoot->_key > key)                return _Find(pRoot->_pLeft, key);            else if(pRoot->_key < key)                return _Find(pRoot->_pRight, key);            else                return pRoot;        }        return NULL;    }

找到了就返回该节点,没找到就返回NULL。
递归删除:
这里写图片描述
这里写图片描述
代码:

bool Remove_Nor(const K& key)    {        return _Remove(_pRoot, key);    }
bool _Remove(Node*& pRoot, const K& key)    {        if(pRoot == NULL)            return false;        if(pRoot->_key > key)            return _Remove(pRoot->_pLeft, key);        else if(pRoot->_key < key)            return _Remove(pRoot->_pRight, key);        else        {            Node* pDel = pRoot;            //左孩子为空            if(pRoot->_pLeft == NULL)            {                pRoot = pRoot->_pRight;                delete pDel;                pDel = NULL;                return true;            }            //右孩子为空,左孩子不为空            else if(pRoot->_pRight == NULL)            {                pRoot = pRoot->_pRight;                delete pDel;                pDel = NULL;                return true;            }            //左右孩子都不为空            else            {                //先找到右子树的最左结点                Node* MinNodeInRightTree = pRoot->_pRight;                while(MinNodeInRightTree->_pLeft)                    MinNodeInRightTree = MinNodeInRightTree->_pLeft;                //将最左结点与当前节点值交换                pDel->_key = MinNodeInRightTree->_key;                pDel->_value = MinNodeInRightTree->_value;                return _Remove(pRoot->_pRight, MinNodeInRightTree->_key);            }        }        return false;    }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机刷机变砖了怎么办 手部肌肉萎缩了怎么办 龙吐珠花冻着了怎么办 发财树浇水多了怎么办 发财树根部烂了怎么办 发财树的根烂了怎么办 淘米水发酵臭了怎么办 眼睛下的小细纹怎么办 内眼角开的太小怎么办 做完美瞳眼睛红怎么办 纹完眼线眼睛红怎么办 21岁眼下小细纹怎么办 20岁眼部有细纹怎么办 纹身几天后晕色怎么办 屁眼长了痔疮大怎么办 苹果os系统坏了怎么办 苹果6出现白苹果怎么办 苹果平板白屏了怎么办 腿上的皮肤很干怎么办 鱼身上掉了鳞片怎么办 患上恋爱恐慌症怎么办 我觉得活着好累怎么办 我的世界遇到him怎么办 孕妇闻了樟脑球怎么办 电脑不能识别u盘怎么办 电脑识别不了u盘怎么办 神之子武器爆了怎么办 中控本考试没过怎么办 震后安全逃生后怎么办 逃出电梯游戏2关怎么办 车尾灯灯罩破了怎么办 着火了吸入了烟怎么办 多媒课件着火了怎么办 用手楚了眼睛疼怎么办 眼睛又痒又干涩怎么办 比熊吃了奥利奥怎么办 怪物猎人x迷路了怎么办 3ds被破解任天堂怎么办 多肉植物焉了怎么办 文竹的叶子干了怎么办 散白酒卖不出去怎么办