删除二叉搜索树中的节点 LeetCode 701
题目链接:[LeetCode 701 - 中等]
思路
五种情况: 1.找到了 左右子树都为空 2.找到了 左子树或者右子树其中有一个为空 3.找到了 左子树右子树均非空 4.没找到 根节点的val比key小 5.没找到 根节点的val比key大
其中该题最主要的代码为:
TreeNode node = root.right;
while(node.left!=null){
node = node.left;
}
node.left = root.left;
root = root.right;
return root;
递归(使用二叉搜索树的特性):
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null)return root;
if(root.val == key){
if(root.left==null)return root.right;
if(root.right==null)return root.left;
TreeNode node = root.right;
while(node.left!=null){
node = node.left;
}
node.left = root.left;
root = root.right;
return root;
}else if(root.val > key){
root.left = deleteNode(root.left,key);
}else{
root.right = deleteNode(root.right,key);
}
return root;
}
}
修剪二叉搜索树 LeetCode 669
题目链接:[LeetCode 669 - 中等]
思路
该题使用递归的方式来解决会较为复杂。(思路复杂,代码简洁) 主要是考虑到二叉搜索树的特性 如果根节点的值大于high,那么其右子树中的右侧也不符合要求,那么去判断右子树中的左节点的大小,这边简单的去判断其右子树,如果小于low同理。
递归(使用二叉搜索树的特性):
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if(root == null) return root;
if(root.val < low){
return trimBST(root.right,low,high);
}
if(root.val > high){
return trimBST(root.left,low,high);
}
root.left = trimBST(root.left,low,high);
root.right = trimBST(root.right,low,high);
return root;
}
}
将有序数组转换为二叉搜索树 LeetCode 108
题目链接:[LeetCode 108 - 简单]
思路
主要是使用到了之前的int mid = begin +((end - begin)>>1);
递归:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) return null;
return sortedArray(nums,0,nums.length-1);
}
private TreeNode sortedArray(int[] nums,int begin, int end){
if(begin>end){
return null;
}
int mid = begin +((end - begin)>>1);
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArray(nums,begin,mid-1);
root.right = sortedArray(nums,mid+1,end);
return root;
}
}
把二叉搜索树转换为累加树 LeetCode 538
题目链接:[LeetCode 538 - 中等]
思路
根据题意得知:递归顺序 : 右中左
递归:
class Solution {
int sum = 0;
public TreeNode convertBST(TreeNode root) {
if(root==null)return null;
convertBST(root.right);
sum += root.val;
root.val = sum;
convertBST(root.left);
return root;
}
}