0
点赞
收藏
分享

微信扫一扫

二叉树寻路

香小蕉 2021-09-21 阅读 64
今日算法
题目描述:
示例 1:
示例 2:
思路一:
class Solution {
    public List<Integer> list = new ArrayList();
    public List<Integer> pathInZigZagTree(int label) {
        Map<Integer, Integer> map = new HashMap();
        map.put(1, 1); // 初始化第一行与第一行元素个数关系.
        int row = 1, count = 1, sum = 1;
        int[] arr = new int[10000000];
        arr[0] = 1;
        int i = 1, mark = 0;
        while (count < label) {
            row++; // 行数
            count *= 2; // 计算每行数据
            int one = sum + 1;
            sum += count; // 总数据.
            int two = sum;
            int index = count;
            // if (count < label) {
                while (index-- > 0) {
                    if (row % 2 == 0) {
                        arr[i++] = two--;
                        if (arr [i - 1] == label) {
                            mark = i - 1;
                        }
                    } else {
                        arr[i++] = one++;
                        if (arr[i - 1] == label) {
                            mark = i - 1;
                        }
                    }       
                }
        }
        List<Integer> result = new ArrayList();
        while (mark > 0) {
            result.add(arr[mark]); // 根据索引获取元素.
            mark--;    
            mark /= 2; // 获取父节点索引.
     
        }
        result.add(1);
        Collections.reverse(result);
        return result;
    }
}
思路二:
代码实现:
class Solution {
    public List<Integer> list = new ArrayList();
    public Map<Integer, Integer> map = new HashMap();
    public List<Integer> pathInZigZagTree(int label) {
       int count = 1, row = 1, sum = 1;
       list.add(label);
       map.put(1, 1); //  初始化第一行与第一行元素个数关系.
       while (sum < label) {
           row++; // 当前行;
           count *= 2; //当前行元素个数.
           sum += count;  // 元素总数
           map.put(row, count);  // 维护行数与当前行元素个数关系.    
       }

       List<Integer> result = new ArrayList();
        label = map.get(row) - label + sum; // 获取label对称元素.
       while (row > 0) {
            int index = map.get(row); // 获取当前行元素个数.
             label = index - label + sum; // 获取对称元素.
             result.add(label);          
             sum -= index;
             label /= 2; // 获取父节点的对称元素.
             row--;
       }
       Collections.reverse(result);
       return result;
    }
}
举报

相关推荐

0 条评论