请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

我是这么写的非递归,总感觉哪里不对劲,老师能帮着看看吗?

1
2
3
4
5
6
7
8
9
    void removeMin1(){
        assert(root != NULL);
        Node* node = root;
        while(node->left != NULL){
            node = node->left;
        }
 
        node = node->right;
    }


正在回答

插入代码

1回答

liuyubobobo 2017-04-24 03:57:16

你的这个写法,在while循环以后,node找到了二叉树中的最小元素所存储的node。之后,你的语句node = node->right,只是将在这个函数里声明的node指针变量指向了你找到的这个最小元素的右节点,而整个二叉树没有发生改变。


要想改变整个二叉树,你需要找到这个最小元素的父节点,让这个最小元素的父节点的左孩子,指向这个最小元素的右孩子。再想想看:)


加油!

1 回复 有任何疑惑可以回复我~
  • 提问者 zhangjiuding #1
    知道了,node是一个指针,改变它的指向没有意义,但是我对node进行的操作怎样才能对root产生影响呢?
    回复 有任何疑惑可以回复我~ 2017-04-24 22:31:41
  • 提问者 zhangjiuding #2
    我的意思是node中最小元素父节点的左孩子指向最小元素右节点后,root就已经改变了吗?
    回复 有任何疑惑可以回复我~ 2017-04-24 22:38:38
  • liuyubobobo 回复 提问者 zhangjiuding #3
    node是一个在这个函数中临时开辟的指针,改变它本身的指向,当这个函数结束的时候,这个指针也被销毁了,这个改变不会保留。但是当这个指针指向二叉树的一个节点的时候,改变这个指针指向节点的具体内容是有意义的。所以通过这个指针,无论是改变node->key,node->value,node->left还是node->right,都对node指向的节点内容进行了真实的改变。可以试试看:)
    回复 有任何疑惑可以回复我~ 2017-04-24 23:28:35
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号