想对于二叉查找树的查找、插入等操作来说,二叉查找树的删除操作是比较复杂的。在具体的分析中可以根据待删除节点的: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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ny_mg/article/details/48155259