删除二叉搜索树中的节点
节点删除要比节点增加复杂得多。主要需要考虑五种情况。
递归法:
1.确定递归参数以及返回值
参数:root原树节点 要删除的节点
返回值:返回删除后的树节点root
2.确定终止条件
遇到空节点后返回
3.确定单层递归的逻辑
删除节点所遇到的五种情况:
- 第一种情况:没找到删除的节点,遍历到空节点直接返回了
- 找到删除的节点
- 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
- 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
- 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
- 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
完整代码如下:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root=deleteNode1(root,key);
return root;
}
public TreeNode deleteNode1(TreeNode root,int key){
if(root==null){
return null;
}
if(root.val>key){
root.left=deleteNode1(root.left,key);
}else if(root.val<key){
root.right=deleteNode1(root.right,key);
}else{
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;
}
}
将有序数组转换为二叉搜索树
思路:从数组中间位置取值作为节点元素
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
递归法
1.确定递归函数参数和返回值
参数:传入数组 左下标left 右下标right(本题我使用左闭右开型区间)
2.确定递归终止条件
left>right 返回空节点
3.确定单层递归逻辑
int mid=left+(right-left)/2;取中间位置的元素构造节点
接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节 点。
最后返回root节点。
迭代法
迭代法可以通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下标,一个队列放右区间下标。
模拟不断分割的过程
完整代码如下:
递归法
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST1(nums,0,nums.length);
}
public TreeNode sortedArrayToBST1(int[] nums,int left,int right){
if(left>=right){
return null;
}
if(right-left==1){
return new TreeNode(nums[left]);
}
int mid=left+(right-left)/2;
TreeNode root=new TreeNode(nums[mid]);
root.left=sortedArrayToBST1(nums,left,mid);
root.right=sortedArrayToBST1(nums,mid+1,right);
return root;
}
}
把二叉搜索树转换为累加树
从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
完整代码如下
class Solution {
int sum;
public TreeNode convertBST(TreeNode root) {
sum=0;
convertBST1(root);
return root;
}
public TreeNode convertBST1(TreeNode root){
if(root==null){
return root;
}
convertBST1(root.right);
sum+=root.val;
root.val=sum;
convertBST1(root.left);
return root;
}
}