vlambda博客
学习文章列表

【数学】1104. 二叉树寻路(中等)

让我们先来看看这道题目的描述

因为题目给出的是完全二叉树,所以我们可以用数学技巧来实现,当偶数行时,label是从右向左排列的,而当奇数行时,label是从左向右排列的。

如果不考虑奇偶性,都按照从左到右的顺序,一个节点的两个子节点的值分别为val * 2 , val * 2 + 1,有比较强的规律

所以我们将偶数行的值先按照正常顺序排列,再计算得到真正的值

一个偶数行的数值真正的情况应该为 2 ^ 行数 - 1 + 2 ^ 行数 - 1  - val

 private int reverse(int val, int depth){ return (1 << depth - 1) + (1 << depth) - 1 - val; }




class Solution{ public List<Integer> pathInZigZagTree(int label) { List<Integer> ans = new ArrayList<>(); int depth = findDepth(label);                 if (depth % 2 == 0) { label = reverse(label, depth); }          while(depth > 0){ if(depth % 2 != 0){ ans.add(label); }else{ ans.add(reverse(label, depth)); } depth--; label >>= 1; } Collections.reverse(ans); return ans;
} private int findDepth(int val){ int depth = 0; while(val >= 1){ val >>= 1; depth++; } return depth; } private int reverse(int val, int depth){ return (1 << depth - 1) + (1 << depth) - 1 - val; }}

如果计算出的总行数为偶数,需要先对这个label值进行操作,否则会发生错误。也可以把这一行单独拿出来讨论~