java算法训练第十三天

本文详细介绍了如何在二叉搜索树中进行搜索和插入操作,分别提供了递归和迭代两种思路的解决方案。此外,还探讨了在非搜索树中搜索节点的方法。最后,讲解了两数相加问题的双指针解法,通过迭代更新链表节点实现数字相加。总结指出,虽然递归代码简洁,但迭代通常效率更高。
摘要由CSDN通过智能技术生成


题库

一、二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
原题

1.递归思维

运用二叉树的深度优先搜索,当访问到的结点的值大于目标值时,搜索结点的左子树,反之搜索结点的右子树,当访问到叶子结点时返回 null。
代码如下:

    public TreeNode searchBST(TreeNode root, int val) {
        if(root == null)
			return null;
		if(val == root.val)
			return root;
		return searchBST(val < root.val ? root.left:root.right,val);
    }

2.迭代思维

使用循环来不断判断要访问结点的左子树还是右子树,直到找到目标结点。
代码如下:

public TreeNode searchBST(TreeNode root,int val) {
		while (root != null) {
            if (val == root.val) {
                return root;
            }
            root = val < root.val ? root.left : root.right;
        }
        return null;
	}

3.当该二叉树不为搜索树(个人想法)

如果该二叉树不为搜索树,该如何搜索结点?可以运用递归思维,不断搜索结点的左右子树,直到找到目标结点。
代码如下:

	public TreeNode searchBST(TreeNode root,int val) {
		if(root == null)
			return root;
		if(root.val == val)
			return root;
		TreeNode left = searchBST(root.left,val);
		TreeNode right = searchBST(root.right,val);
		if(left == null && right == null)
			return null;
		if(left == null)
			return right;
		return left;
	}

二、二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。原题

1.递归思维(个人想法)

运用递归思维,当访问到的结点是空结点时,证明目标位置为空,直接生成一个结点并赋值再连到树上;当访问到的结点的值大于目标值时,递归访问它的左子树,反之递归访问它的右子树,直到找到空结点。
代码如下:

public TreeNode insertIntoBST(TreeNode root,int val) {
		return diGui(root,val);
	}
	
	public TreeNode diGui(TreeNode root,int val) {
		if(root == null)
			return new TreeNode(val);
		if(root.val < val)
			root.right = diGui(root.right,val);
		else
			root.left = diGui(root.left,val);
		return root;
	}

2.迭代思维

运用循环不断判断要访问结点的左子树还是右子树,直到访问到空结点,则生成一个新的结点并赋值,再把它连到树上。
代码如下:

public TreeNode insertIntoBST(TreeNode root,int val) {
		if(root == null)
			return new TreeNode(val);
		TreeNode p = root;
		while(p != null) {
			if(p.val < val) {
				if(p.right == null) {
					p.right = new TreeNode(val);
					break;
				}else {
					p = p.right;
				}
			}else {
				if(p.left == null) {
					p.left = new TreeNode(val);
					break;
				}else {
					p = p.left;
				}
			}
		}
		return root;
	}

三、两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。原题

双指针解法(个人想法)

建立两个指针,一个作为结果的头指针,在最后时刻返回,另一个作为暂存指针,暂时存储已访问的结点,具体原理请看代码。
代码如下:

	public ListNode addTwoNumbers(ListNode l1,ListNode l2) {
		if(l1 == null && l2 == null)
			return l1;
		ListNode root = l1,now = l1;
		int num = 0,pre = 0;
		while(l1 != null && l2 != null) {
			pre = l1.val;
			l1.val = (l1.val + l2.val + num) % 10;
			if(pre + l2.val >= 10)
				num = 1;
			else
				num = 0;
			now = l1;
			l1 = l1.next;
			l2 = l2.next;
		}
		if(l1 == null && l2 == null) {
			if(num == 1) {
				now.next = new ListNode(1);
			}
			return root;
		}
		if(l1 == null) {
			now.next = l2;
			l1 = l2;
			while(l1 != null) {
				pre = l1.val;
				l1.val = (l1.val + num) % 10;
				if(pre + num >= 10)
					num = 1;
				else
					num = 0;
				now = l1;
				l1 = l1.next;
			}
		}else {
			while(l1 != null) {
				pre = l1.val;
				l1.val = (l1.val + num) % 10;
				if(pre + num >= 10)
					num = 1;
				else
					num = 0;
				now = l1;
				l1 = l1.next;
			}
		}
		if(num == 1)
			now.next = new ListNode(1);
		return root;
	}

总结

递归虽然可以使代码更为简洁,但反复调用函数需要耗费更多的时间,所以相对来说使用迭代思维程序的效率会更高。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值