1104. 二叉树寻路|8月更文挑战

119 阅读2分钟

在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。

如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;

而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。

给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。

图片.png 示例 1:

输入:label = 14 输出:[1,3,4,14] 示例 2:

输入:label = 26 输出:[1,2,6,10,26]

解题思路

  1. 利用二叉树的性质,编号为n的子节点,父节点为n/2(因为n为int,所以才可以这样算),因此我们这题就是需要不断往上找父节点
  2. 因为树中的节点 逐行 依次按 “之” 字形进行标记,正常二叉树编号每一层从左到右的顺序进行标记,而偶数层在这题是相反的,但是我们可以把顺序的节点映射为反序来加入结果列表,对于偶数行按从右到左的顺序进行标记的情况,可以转换成按从左到右的顺序进行标记的情况,然后按照上述思路得到路径,只要对偶数行的标号进行转换即可。因此我们这次只需要按正常完全二叉树的编号去寻找父节点,当遇到父节点在偶数层的时候,将节点映射为反序的加入结果列表。

代码

class Solution {
    public List<Integer> pathInZigZagTree(int label) {

        int i=0;
        while (Math.pow(2,i)<=label)
        {
            i++;
        }
        List<Integer> list=new ArrayList<>();
        i--;
        if (i%2==1)
          {
            label=3* (int) Math.pow(2,i)-1-label;
          }
        while (i>=0)
        {
          list.add(i%2==1?3* (int) Math.pow(2,i)-1-label:label);
          label/=2;
          i--;
        }
        Collections.reverse(list);
        return list;
    }
}