450.删除二叉搜索树中的节点,669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树

450.删除二叉搜索树中的节点

第一种情况:没找到删除的节点,遍历到空节点直

第二种情况:删除节点的左右孩子都为空,直接删除节点, 返回NULL为根节点

第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点

第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点

第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。 ( 找到右子树的最左边节点 将左子树链接到左子树后边。

class Solution {
public:
    TreeNode* Delete( TreeNode* cur , int key ) {
        if ( cur == NULL ) return NULL;
        if ( cur -> val == key ) {
            if ( cur -> left == NULL && cur -> right == NULL ) {
                return NULL;
            }
            else if ( cur -> left == NULL && cur -> right != NULL ) {
                return cur -> right;
            }
            else if ( cur -> left != NULL && cur -> right == NULL ) {
                return cur -> left;
            }
            else {
                TreeNode* di = cur -> right ;
                while ( di -> left != NULL ) di = di -> left;
                di -> left = cur -> left;
                return cur -> right;
            }
        } 
        if ( cur -> val > key ) cur -> left = Delete( cur -> left , key );
        if ( cur -> val < key ) cur -> right = Delete( cur -> right , key );
        return cur;
    }
    TreeNode* deleteNode(TreeNode* root, int key) {
        return Delete( root , key );

    }
};

669. 修剪二叉搜索树 

不用重构二叉树, 直接将删除节点后边的元素连到没删除的节点的后边

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if ( root == NULL ) return NULL;
        if ( root -> val < low ) {
            TreeNode* right = trimBST(root -> right , low , high);
            return right;
        }
        if ( root -> val > high ) {
            TreeNode* left = trimBST( root -> left , low , high );
            return left;
        }
        root -> left = trimBST( root -> left , low , high );
        root -> right = trimBST( root -> right , low , high );
        return root;
    }
};

108.将有序数组转换为二叉搜索树

与构建二叉树一样,注意根节点是 数组中间的元素, 左子树用左边数组构建,右子树用 右边数组构建

class Solution {
public:
TreeNode* creat( vector < int > &nums , double  low , double height ) {
    if ( low > height ) return NULL;
    long mid = ceil ( ( height + low ) / 2 ) ;     // 小数直接舍掉,所以中间值 是偏左边的,用ceil函数可以实现小数点进一 , 但注意要是double类型才行
    TreeNode* root = new TreeNode( nums[mid] );      
    //cout << "nums[mid] = " << nums[mid] << endl;
    root -> left = creat( nums , low , mid - 1 ) ;
    root -> right = creat( nums , mid + 1 , height );
    return root;
}
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if ( nums.size() == 0 ) return NULL;
        TreeNode* root =  creat( nums , 0 , nums.size() - 1 );
        return root;

    }
};

538.把二叉搜索树转换为累加树

采用中序遍历 二叉搜索树是 单调递增的 有序数组, 

中序遍历    左中右    是 从前往后 遍历的数组

如果采用    右中左 , 就是 从后往前 遍历的数组

class Solution {
public:
    TreeNode* pre = NULL ;
    TreeNode* convertBST(TreeNode* root) {
        if ( root == NULL ) return NULL;
        root -> right = convertBST( root -> right );
        if ( pre != NULL ) {
            root -> val += pre -> val;
        }
        pre = root ;
        root -> left = convertBST( root -> left );
        return root;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值