1104. 二叉树寻路

题目来源:1104. 二叉树寻路

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

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

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

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

 

/**
 * @param {number} label
 * @return {number[]}
 */
var pathInZigZagTree = function(label) {
  var getReverse = (node, h) => {
    return (1<<h) - 1 - node + (1<<(h-1))
  }
  let h = 1
  let res = []
  while((1<<h) <= label){
    h += 1
  }
  if(h % 2 === 0){
    label = getReverse(label, h)
  }
  while(h>0){
    if(h % 2 === 0){
      res.push(getReverse(label, h))
    }else{
      res.push(label)
    }
    label = label >> 1
    h -= 1
  }
  return res.reverse()
};

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= label <= 10^6
posted @ 2021-07-29 10:44  尖子  阅读(33)  评论(0编辑  收藏  举报