1.二叉树的最小深度
给定二叉树,找到它的最小深度。
最小深度是沿从根节点到最近的叶节点的最短路径上的节点数。
注意: 叶子是没有子节点的节点。
例:
给定二叉树[3,9,20,null,null,15,7],
返回其最小深度= 2。
想法:使用bfs直接遍历,找到根和子叶节点最短路径的节点数,且该子节点没有左孩子节点也无右孩子节点
代码:
public int minDepth(TreeNode root) {
if(root == null) return 0;
List<TreeNode> list = new LinkedList<>();
list.add(root);
int level = 1;
while(!list.isEmpty()){
int len = list.size();
for(int i = 0;i<len;i++){
TreeNode node = list.remove(0);
if(node.left == null && node.right == null) return level;
if(node.left != null) list.add(node.left);
if(node.right != null) list.add(node.right);
}
level++;
}
return 0;
2.向树中添加一行:
给定二叉树的根,然后是值v和深度d,您需要v在给定深度添加一行具有值的节点d。根节点位于深度1。
该添加规则是:给定一个正整数的深度d,对于每一个NOT
NULL树节点N的深度d-1,创建两个树节点以价值v为N’s左子树的根和右子树的根。和N’s
原来的左子树应该是新的左子树的根的左子树,其原有的右子树应该是新的右子树的根的右子树。如果depth
d为1表示根本没有深度d-1,则创建一个值为v的树节点作为整个原始树的新根,并且原始树是新根的左子树。注意: 给定的d在范围[1,给定树的最大深度+ 1]。 给定的二叉树至少有一个树节点。
想法:使用dfs遍历后进行添加
代码:
public class Solution {
public TreeNode addOneRow(TreeNode root, int v, int d) {
if(d == 1){
TreeNode dummy = new TreeNode(v);
dummy.left = root;
return dummy;
}
helper(root, v, d, 1);
return root;
}
public void helper(TreeNode root,int v, int d, int cur){
if(root == null) return;
if(cur == d - 1){
TreeNode temp = new TreeNode(v);
temp.left = root.left;
root.left = temp;
TreeNode temp2 = new TreeNode(v);
temp2.right = root.right;
root.right = temp2;
return;
}
helper(root.left, v, d, cur + 1);
helper(root.right, v, d, cur + 1);
}
}
3.在二进制搜索树中搜索:
给定二叉搜索树(BST)的根节点和值。您需要在BST中找到节点的值等于给定值的节点。返回以该节点为根的子树。如果此节点不存在,则应返回NULL。
在上面的例子中,如果我们想要搜索值5,因为没有带有值的节点5,我们应该返回NULL。
请注意,空树表示为NULL,因此您将看到预期的输出(序列化树格式) [],而不是null。
想法:直接递归遍历即可
代码:
public TreeNode searchBST(TreeNode root, int val) {
while(root != null) {
if(root.val == val)
break;
else if (root.val > val)
root = root.left;
else
root = root.right;
}
return root;
}