刪除二叉尋找樹的節點,二叉節點
想對於二叉尋找樹的尋找、插入等操作來說,二叉尋找樹的刪除操作是比較複雜的。在具體的分析中可以根據待刪除節點的: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; }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。