6.18 二叉树完结

二叉搜索树中的插入操作

这个终止条件刚好和给一个空树的情况相同

    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;
		
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值