https://leetcode-cn.com/problems/path-in-zigzag-labelled-binary-tree/
class Solution {
public List<Integer> pathInZigZagTree(int label) {
List<Integer> list = new ArrayList<>();
if (label == 1) {
list.add(1);
} else {
list.addAll(pathInZigZagTree(getParentLabel(label)));
list.add(label);
}
return list;
}
/**
* 根据提供的label确定,label的位置
*/
private int getPosition(int label) {
// 1.确定行数,从0开始
int rowNum = (int) (Math.log(label) / Math.log(2));
if (rowNum % 2 == 0) {
// 正序
return label;
} else {
// 倒序 当期行的最大值+最小值-label,就是二叉树的位置
return (int) (Math.pow(2, rowNum) + Math.pow(2, rowNum + 1) - 1 - label);
}
}
/**
* 根据提供的label确定,label的位置
*/
private int getParentLabel(int label) {
// 1.确定行数,从0开始
int rowNum = (int) (Math.log(label) / Math.log(2));
if (rowNum % 2 == 0) {
// 正序
int parentPosition = label / 2;
return (int) (Math.pow(2, rowNum) + Math.pow(2, rowNum - 1) - 1 - parentPosition);
} else {
// 倒序 当期行的最大值+最小值-label,就是二叉树的位置
int parentPosition = (int) (Math.pow(2, rowNum) + Math.pow(2, rowNum + 1) - 1 - label);
return parentPosition / 2;
}
}
}
这里实际考察的问题是满二叉树的一些性质:
如果一个二叉树的层数为h,且结点总数是(2^h) -1 ,则它就是满二叉树。 h>=1
叶子数是:2^h
第h层的结点数是: 2^(h-1)
总结点数是: 2^h-1 (2的h次方减一)
总节点数一定是奇数
如果对一棵有n个结点的完全二叉树的结点按层序编号, 则对任一结点i (1≤i≤n) 有:
如果i=1, 则结点i是二叉树的根, 无双亲;如果i>1, 则其双亲parent(i) 是结点[i/2]
如果2i>n, 则结点i无左孩子, 否则其左孩子lchild (i) 是结点2i;
如果2i+1>n, 则结点i无右孩子, 否则其右孩子rchild (i) 是结点2i+1