本人电子系,只为一学生。心喜计算机,小编以怡情。
给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。
1、叶子节点
2、删除只有一个子树的节点
3、删除有两个孩子的节点
方法:层次遍历非递归做
感悟:这道题并不难,但是却十分的考验细节的把握
技巧:可以加个伪根节点,道理和链表加一个虚头结点一样,为了方便编程
public TreeNode removeNode(TreeNode root, int value) {
// write your code here
if(root==null) return null;
TreeNode fakeroot=new TreeNode(0);
fakeroot.left=root;
Queue<TreeNode> linshi=new LinkedList<>();
linshi.offer(fakeroot);
while(!linshi.isEmpty())
{
TreeNode p=linshi.poll();
if(p.left!=null)
{
TreeNode q=p.left;
if(q.val==value)
{
if(q.left==null&&q.right==null)
{
p.left=null;
break;
}
if(q.left==null)
{
p.left=q.right;
break;
}
if(q.right==null)
{
p.left=q.left;
break;
}
{
TreeNode t=q.left.right;
if(t==null)
{
q.left.right=q.right;
p.left=q.left;
return fakeroot.left;
}
TreeNode pre=q.left;
while(t.right!=null)
{
t=t.right;
pre=pre.right;
}
t.left=q.left;
t.right=q.right;
p.left=t;
pre.right=null;
}
}
linshi.offer(p.left);
}
if(p.right!=null)
{
TreeNode q=p.right;
if(q.val==value)
{
if(q.left==null&&q.right==null)
{
p.right=null;
break;
}
if(q.left==null)
{
p.right=q.right;
break;
}
if(q.right==null)
{
p.right=q.left;
break;
}
{
TreeNode t=q.right.left;
if(t==null)
{
q.right.left=q.left;
p.right=q.right;
return fakeroot.left;
}
TreeNode pre=q.right;
if(t!=null)
while(t.left!=null)
{
t=t.left;
pre=pre.left;
}
t.right=q.right;
t.left=q.left;
p.right=t;
pre.left=null;
}
}
linshi.offer(p.right);
}
}
return fakeroot.left;
}