leetcode刷题(二叉树翻转、二叉树左右节点互换)

关于java的相关学习和一些笔记,祝大家儿童节快乐!!!
博客地址
题目一描述:
翻转一颗二叉树
题目链接
题目分析:
对于这道题目可以先想着如何遍历一颗二叉树,因为需要访问树中的每一个节点,因此个人喜欢递归的方式进行访问。
注: 其实这种题目是一种思想,选中当前一个节点,默认当前节点的左结点能够返回一个翻转后的左子树的头结点,右子树上能够返回一个翻转后右子树的头结点,当前节点将左右头结点进行交换。
代码如下:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null)return null;
        //默认左子树翻转后返回头结点
        TreeNode l = invertTree(root.left);
        //默认右子树翻转后返回头结点
        TreeNode r = invertTree(root.right);
        //交换左右子树
        root.left = r ;
        root.right = l;
        return root;
    }
}

题目二描述:
给定一个二叉树,寻找二叉树最近的公共结点
题目链接
题目二分析:
这道题目之前进行过分析,但是依旧将其拿出来是因为,对于这种类型的题目放在一起,更容易掌握解题方式。
默认当前节点左子树能够返回一个节点,默认右子树返回一个个节点,如果左子树为空说明两个目标节点在树的右侧,如果右子树为空说明两个目标节点在树的左侧,如果两个都不为空说明当前节点为最近的公共祖先
代码如下:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null||root == p||root==q)return root;
        //默认左树返回一个节点
        TreeNode left =  lowestCommonAncestor(root.left,p,q);
        //默认右树返回一个节点
        TreeNode right =  lowestCommonAncestor(root.right,p,q);
        //左右都不为空,说明当前节点最近
        if(left != null && right!= null){
            return root;
        }
        //左结点不为空说明最节点包含有两个节点
         if(left != null){
            return left;
        }
        //说明右结点包含有两个节点
        if(right != null){
            return right;
        }
        //两个null
        return null;
    }
}

附加一道题目:
这是牛客网的题目,是一道清华的复试题目,不过还挺难的。
题目描述:
按手机的输入方式输入一个字符串,记录其花费的时间,对于同一按键上的元素,停顿两段时间,对于不同按键上的字符可以直接按,每按一个字符花费1个时间段。
题目链接
题目分析:
首先应采用一个空间记录每个字符所在的位置即该字符在手机键盘的哪一个按键上,同时记录该字符在该按键的第几个位置。
手机上的字符占8个按键,abc在第一个按键上,特殊的第6个和第八个按键占4个字符。

字符按钮,在按钮上的位置
a1,1
b1,2
z8,4

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Main{
    public static void main(String[] args)throws IOException{
    //字符输入流
     BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		char str = 'a' - 1;
		int x = 1;
		//开辟空间存放对应关系
		HashMap<Character, Position> map = new HashMap<>();
		for (; str <= 'z';) {
		//循环将26个字母放入map集合中
			int y = 1;
			map.put(++str, new Position(x, y++));
			map.put(++str, new Position(x, y++));
			map.put(++str, new Position(x, y++));
			if (x == 6 || x == 8)
				map.put(++str, new Position(x, y++));
			x++;
		}

		String in = "";
		//循环读取串,并判断花费时间
		while ((in = bf.readLine()) != null) {
			int count = 0;
			//字符串中第一个元素花费的时长
			count += map.get(in.charAt(0)).y;
			for (int i = 1; i < in.length(); i++) {
			//如果当前元素与之前的元素处于相同的按键上,count+2
				if (map.get(in.charAt(i)).x == map.get(in.charAt(i - 1)).x) {
					count += 2;
				}
				//count+当前按键执行的时间
				count += map.get(in.charAt(i)).y;
			}
			//输出
			System.out.println(count);
		}
}
}
//由于在hash表中既要记录元素在哪个按键上又要记录元素在哪个位置,因此自定义对象存放信息。
class Position {
	int x;
	int y;

	Position(int x, int y) {
		this.x = x;
		this.y = y;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值