[leetcode]450. Delete Node in a BST二叉搜索树删除节点
2024-10-12 03:37:47
二叉树变量只是一个地址
public static void main(String[] args) {
TreeNode t = new TreeNode(3);
help(t);
System.out.println(t.val);
}
public static void help(TreeNode t)
{
t.val = 6;
}
上边代码通过地址改变了二叉树,输出为6,但是下边代码却只是传入函数的二叉树变量指向了另一个地址,外界的二叉树变量和二叉树的值没有变,输出还是3
public static void main(String[] args) {
TreeNode t = new TreeNode(3);
help(t);
System.out.println(t.val);
}
public static void help(TreeNode t)
{
t = new TreeNode6);
}
所以想改变二叉树,不能改变二叉树变量,而应该通过二叉树变量t调用val,left,right进行赋值,就可以改变,直接改变t只是让t指向另一课树,原本的树没有改变。
下边是答案,思路是先找到节点,再根据节点的不同情况进行操作。
最后的操作很乱,自己都看不下去了,应该递归的改变左右子树,但是眼睛太累了,有空再改吧。
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return null;
if(root.val==key)
{
if (root.left==null) return root.right;
if (root.right==null) return root.left;
TreeNode temp = root.right;
while (temp.left!=null) temp = temp.left;
if (root.left.right!=null) temp.left = root.left.right;
root.left.right = root.right;
root.val = root.left.val;
if (root.left.left==null)
{
root.right = root.left.right;
root.left = null;
}
else {
//这里注意,由于两句话都要用到root.left,所以root.left最后再变
root.right = root.left.right;
root.left = root.left.left;
}
}
else
{
if(root.val>key) root.left = deleteNode(root.left,key);
else root.right = deleteNode(root.right,key);
}
return root;
}
最新文章
- iOS上new Date出现Invalid Date的问题,
- R之data.table -melt/dcast(数据合并和拆分)
- Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)
- DuiLib(一)——窗口及消息
- Csharp 简单操作Word模板文件
- 从PHP官网被攻击,到熟悉SSL(安全链路层)
- [Usaco 再次除草]
- Drupal设置首页默认内容
- 客户端 HttpUtils.java
- Individual Project复审
- Eclipse自定义的透视图如何删除掉?
- Consumer
- Python数据库连接池实例——PooledDB
- {Reship}{Meanshift}Mean Shift Tracking: 2000-2012回顾
- window server IIS组建方法
- lua基础知识笔记
- 分页sql汇总
- 第二课2、ROS
- Git的使用 强制放弃本地所有修改,获取master中最新版本更新本地
- EOJ Monthly 2018.1