现在的位置: 主页 > 在线留言 > 文章列表

删除二叉查找树的节点

作者:上海瑞梁浩行投资咨询有限公司 来源:www.60899055.com 发布时间:2017-09-08 19:13:36
 

删除二叉查找树的节点

想对于二叉查找树的查找、插入等操作来说,二叉查找树的删除操作是比较复杂的。在具体的分析中可以根据待删除节点的:1、左右子树均为空;2、左右子树中有一个为空;3、左右子树均非空的情况来考虑。

其中第3种情况即左右子树均非空的情况较为复杂,删除过程中可以找待删除节点的后继节点,与待删除节点交换,然后把后继节点的右子树接入到待删除节点的父节点即可。

TreeNode* removeNode(TreeNode* root, int value) { // write your code here if(root == nullptr) return root; TreeNode *p, *q; p = root; q = root; //p 指向待删除的节点,q 指向待删除节点的父节点 while(p){ if(value == p -> val){ break; }else if(value < p -> val){ q = p; p = p -> left; }else{ q = p; p = p -> right; } } if(p == nullptr) return root; //p 是叶子节点 if(p -> left == nullptr && p -> right == nullptr){ if(p == q){ return nullptr; }else{ if(q -> left == p){ q -> left = nullptr; }else{ q -> right = nullptr; } return root; } } //p 左右子树中有一个为空 if(p -> left == nullptr || p -> right == nullptr){ if(p -> left == nullptr){ if(p == q){ return q -> right; }else{ if(q -> left == p){ q -> left = p -> right; }else{ q -> right = p -> right; } } }else{ if(p == q){ return q -> left; }else{ if(q -> left == p){ q -> left = p -> left; }else{ q -> right = p -> left; } } } return root; } //p 的左右子树均非空 if(p -> left != nullptr && p -> right != nullptr){ TreeNode *fir = p -> right; TreeNode *sec = p; while(fir -> left != nullptr){ sec = fir; fir = fir -> left; } p -> val = fir -> val; if(p == sec){ p -> right = fir -> right; }else{ sec -> left = fir -> right; } } return root; }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:天门SEO http://tianmen.4567w.com

  • 上一篇:从消费者购买决策模型来看医疗品牌建设的作用
  • 下一篇:最后一页
  •