题库
一、二叉搜索树中的搜索
给定二叉搜索树(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;
}
总结
递归虽然可以使代码更为简洁,但反复调用函数需要耗费更多的时间,所以相对来说使用迭代思维程序的效率会更高。