问题描述:给定一个二叉搜索树的根节点root和一个值key,删除而叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树的性质不变,也是一颗二叉搜索树。递归求解思路:由于二叉搜索树的性质,根节点大于左子树所有节点,小于右子树所有节点,若找到某个节点之后需要找到左子树和右子树两个子树值在最中间那个节点即可,有两种处理方式:第一种是找到左子树的最大节点,第二种是找到右子树的最小节点,都是可行的。此时还有特殊的情况,若没有左子树和右子树,则去除叶子节点之后直接返回null即可,若只有左子树,则左子树的根节点一定是中间那个元素,直接返回左子树即可,若只有右子树,则右子树的根节点一定满足是中间那个元素,直接返回右子树即可,若左子树和右子树均不为null,则找到中间那个值之后(这里找左子树),将其接替替换的那个节点值,并对左子树实行与上述一样的过程,对左子树进行递归求解。
?
public int findTheMaxOfLeftTree(TreeNode root)
{
if(root.right==null){return root.val;}
else{return findTheMaxOfLeftTree(root.right);}
}
public Boolean findTheMaxOfLeftTree(TreeNode root,int key)
{
if(root==null){return false;}
if(root.val==key)
{
if(root.left==null&&root.right==null){root==null;return true;}
if(root.left!=null&&root.right==null){root=root.left;return true;}
if(root.left==null&&root.right!=null){root=root.right;return true;}
int maxLeftValue=findTheMaxOfLeftTree(root.left);
root.val=maxLeftValue;
findTheMaxOfLeftTree(root.left,maxLeftValue);
}else
{
Boolean left=deleteNode(roo.left,key);
if(!left)
{
return?deleteNode(root.right.key;key);
}
}
}
Public TreeNode FindTheMaxOfLeftTree(TreeNode root,int value)
{
findTheMaxOfLeftTree(root,value);
return root;
}