中级农民
- 积分
- 116
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-2-8
- 最后登录
- 1970-1-1
|
思路是用个map来存左右子树的节点,避免重复计算。
根据树的结构不同先手好像没有必胜的方法,只能说保证不败,会出现平局的情况。比如下面这颗树
│ ┌── 7
│ │ └── 12
│ ┌── 3
│ │ │ ┌── 11
│ │ └── 6
│ │ └── 10
└── 1
│ ┌── 5
└── 2
│ ┌── 9
└── 4
└── 8
[3, 1]
- class solution{
- Map<TreeNode,int[]> map = new HashMap<>();
- public boolean findTreeNode(TreeNode root, TreeNode node) {
- int sum = countNumberOfNodes(root);
- int[] temp = map.get(root);
- int b = temp[0];
- int c = temp[1];
- int a = sum - 1 - b - c;
- return a > sum / 2 || b > sum / 2 || c > sum / 2;
- }
- public List<Integer> win(TreeNode root){
- List<Integer> res = new ArrayList<>();
- int[] temp = map.get(root);
- int sum = temp[0]+temp[1]+1;
- for(TreeNode node : map.keySet()){
- int[] num = map.get(node);
- int l = num[0], r = num[1];
- int a = sum - 1 - l - r;
- if(a <= sum/2 && r <= sum/2 && l <= sum/2){
- res.add(node.val);
- }
- }
- return res;
- }
- public int countNumberOfNodes(TreeNode root) {
- if (root == null) {
- return 0;
- } else {
- int a = countNumberOfNodes(root.left);
- int b = countNumberOfNodes(root.right);
- map.put(root,new int[]{a,b});
- return 1+a+b;
- }
- }
- }
复制代码 |
|