树图的知识中,涉及到的缩写不胜枚举
从DFS,SCC再到日常遇到的BST,一个个看似简单的字母背后隐藏着千变万化的树图变换及算法
这次练习,我选取了有关BTS(二叉排序树)的一道题
题目如下:
网址:https://leetcode.com/problems/delete-node-in-a-bst/#/description
题目:Delete Node in a BST
题目描述:
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Note: Time complexity should be O(height of tree).
Example:
root = [5,3,6,2,4,null,7] key = 3 5 / \ 3 6 / \ \ 2 4 7 Given key to delete is 3. So we find the node with value 3 and delete it. One valid answer is [5,4,6,2,null,null,7], shown in the following BST. 5 / \ 4 6 / \ 2 7 Another valid answer is [5,2,6,null,4,null,7]. 5 / \ 2 6 \ \ 4 7在给定的一个二叉排序树之中,找出指定值并将那个结点删除,然后对删除的结点的相关结点进行排序并返回根节点
找到指定结点并不是一件非常困难的事情,难点在于,如何在删除了节点之后,将剩下未处理的结点,用最简易的方法,形成一个新的树。
解题:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(!root) return NULL;
if(root -> val == key){
if(!root -> right){
TreeNode* l = root -> left;
delete root;
return l;
}
else{
TreeNode* r = root -> right;
while(r -> left)
r = r -> left;
swap(root -> val, r -> val);
}
}
root -> left = deleteNode(root -> left, key);
root -> right = deleteNode(root -> right, key);
return root;
}
};/**