二叉树寻路


二叉树寻路

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

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

而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。
这是图片
给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。

思路

由于这题是寻找路径,所有我的想法是,先找到目标label结点,根据完全二叉树的特点,逐步找到有关的路径。

1.此题奇数行是正序,偶数行是逆序。
2.且目标结点的一半一定在上一行的结点中。
3.其中目标结点的上一个结点数字label,与上一层结点的中间结点mid有一定关系

  • 若mid >= label,路径为:mid + (mid - label) + 1;
  • 若 mid < label,路径为:mid - (label - mid) + 1;

4.先前存储路径是由大到小,目标输出是由小到大,最后倒置一下就ok了

AC代码

class Solution {
public:
    vector<int> pathInZigZagTree(int label) {
        stack<int>s;
        vector<int>ret;
        while (label>1) {
            s.push(label);
            label /= 2;        
            if (label == 1) {
                break;
            }
            int h = log2(label) + 1; 
            int mid = (pow(2, h - 1) + pow(2, h) - 1) / 2;  
            if (label <= mid) {             
                label = mid + (mid - label) + 1;
            }
            else {
                label = mid - (label - mid) + 1;
            }
        }
        s.push(1);
        while (!s.empty()) {
            ret.push_back(s.top());
            s.pop();
        }
        return ret;
    }
};

文章作者: 曹毅
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 曹毅 !
  目录