让唯一的孩子顶上来
同一个 bst_remove,这次删 15——它只有左孩子 13。删完之后输出根的左边是几(13 应该顶了上来)。 (这一节只管把节点从树上摘掉,摘下来的内存先不管,下一节讲怎么 delete。) (本题用 g++ -std=c++17 -
右子树里最小的顶上来
同一个 bst_remove,这次删 17——它左右都有孩子,是最难的一种。删完之后输出新的根是几。 (这一节只管把节点从树上摘掉,摘下来的内存先不管,下一节讲怎么 delete。) (本题用 g++ -std=c++17 -O0 编译。)
三种删完中序还得升序
同一个 bst_remove,把三种情况连着删一遍:先删叶子 13、再删单孩子 15、最后删双孩子 17。删完之后中序走一遍,把剩下的数按顺序拼起来输出(用 / 隔开)。 (这一节只管把节点从树上摘掉,摘下来的内存先不管,下一节讲怎么 de
删掉的节点还要做什么
第 1 步:删叶子 20:先让父指针变空 第 2 步:再 delete 它,内存还回去 第 3 步:后序:先孩子后自己,删 30 第 4 步:后序:先孩子后自己,删 60 第 5 步:后序:先孩子后自己,删 70 第 6 步:后序:先孩子后
双子删除真正 delete 的是谁
删有两个孩子的节点时,先把后继的值抄上来,真正被 delete 的那个节点是【0】。
为什么用 BNode*& 参数
删除函数写成 void erase(BNode*& node, int val),引用参数的好处是【0】。
删一个叶子后还剩几个
把 17、24、15、13、23 依次插进一棵空的 BST。运行下面这段程序: #include <iostream> #include <string> #include <vector> using
后序释放整棵树
把 17、24、15、13、23 依次插进一棵空的 BST。运行下面这段程序: #include <iostream> #include <string> #include <vector> using
删叶子并归还内存
补全 erase 里「只有一个孩子或没有孩子」那一支:接好孩子,再 drop 掉自己。删掉叶子 13 后,输出「剩几个没归还」和中序,格式如 剩4个:甲-乙-丙-丁。 (本题用 g++ -std=c++17 -O0 编译。)
删单孩子并归还内存
同一个 erase,这次删 15(只有左孩子 13)。补全后输出「剩几个没归还」和中序,格式同上。 (本题用 g++ -std=c++17 -O0 编译。)