二叉搜索树中的插入操作
这个终止条件刚好和给一个空树的情况相同
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root==null)return new TreeNode(val);
if(root.val>val)root.left=insertIntoBST(root.left, val);
if(root.val<val)root.right=insertIntoBST(root.right, val);
return root;
}
删除二叉搜索树中的结节点
这道题犯了个小错误,一直没有ac,原因如下:
if if else:这样else始终和最后一个if匹配,如果通过第一个if,没通过第二个if,但是也会进入到else中,这样就错了,但是如果if里面都有return,可以这么分情况写(如下),否则如果只是进入到一个条件中,就老老实实写else if。
if()return;
if()return;
else{}
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null)return null;
//向左子树走
if(root.val>key)root.left=deleteNode(root.left, key);
//向右子树走
else if(root.val<key)root.right=deleteNode(root.right, key);
//找到root就是要删除的节点
//把root.right放上去,并且找到root.right的最小的数(也就是最左边的数),让这个数的左结点为root.left
else {
TreeNode left=root.left;
TreeNode right=root.right;
if(root.left==null)return root.right;
if(root.right==null)return root.left;
while(right!=null) {
if(right.left==null)break;
right=right.left;
}
right.left=left;
root=root.right;
}
return root;
}
插入和删除操作一样:有返回值的话,可以利用返回值完成新改变的节点与其父节点的赋值操作
比如在插入操作中
if (root->val > val) root->left = insertIntoBST(root->left, val);
if (root->val < val) root->right = insertIntoBST(root->right, val);
return root;
通过递归函数返回值完成了新加入(插入或删除)节点的父子关系赋值操作了,下一层将加入节点返回,本层用root->left或者root->right将其接住。
将有序数组转换为AVL数
思想:升序数组要变为AVL数,那就从数组的中间位置去找根节点
参数值、终止条件:数组,每次构建子树的数组范围;当数组范围left、right越界终止,返回null
每层做的事情:找到最中间的数,把它当做根节点,然后划分数组范围,分别创建左右子树
返回值:向上层返回当前根节点
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length==0)return null;
return Build(nums, 0, nums.length-1);
}
public TreeNode Build(int[] nums, int left, int right) {
if(left>right)return null;
int point=(left+right)/2;
TreeNode root=new TreeNode(nums[point]);
root.left=Build(nums, left, point-1);
root.right=Build(nums, point+1, right);
return root;
}