垂直遍历二叉树,返回各个等级的列表

给定一个二叉树,返回其结点 垂直方向(从上到下,逐列)遍历的值。

如果两个结点在同一行和列,那么顺序则为 从左到右

示例:

思路:假设跟节点的位置是0,

跟节点左孩子的位置减1就是-1,右孩子的位置加1,

跟节点左孩子的右孩子位置就是0,-1+1=0,那么1,5节点就是同一个等级的。

源码:

package com.my.java.suanfa.ListNode;

public class MyListNode {
    int val;
    MyListNode left;
    MyListNode right;
    MyListNode(int val) {
        this.val = val;
    }
    MyListNode(int val,MyListNode left,MyListNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
//垂直遍历二叉树,返回各个等级的列表
    public static Map<Integer,List<MyListNode>> chuizhiTraversal(MyListNode root) {
        if (root == null) {
            return null;
        }
        //result 按照等级纬度,存储各个等级下的元素节点,跟节点初始化为0
        HashMap<Integer,List<MyListNode>> result = new HashMap<>();
        List<MyListNode> list = new ArrayList<>();
        list.add(root);
        result.put(0,list);

        //queue采用层次遍历,先进先出
        Queue<MyListNode> queue = new LinkedList<>();
        queue.offer(root);

        //nodeMap存储各个节点是第几等级,跟节点是0等级
        HashMap<MyListNode,Integer> nodeMap = new HashMap<>();
        nodeMap.put(root,0);

        while (!queue.isEmpty()) {
            MyListNode node = queue.poll();
            int index = nodeMap.get(node);
            if (node.left != null) {
                //入栈,先进的会先出
                queue.offer(node.left);
                //左边节点的等级-1,此处index的值不能变
                nodeMap.put(node.left,index-1);
                //找到返回结果中这个等级的元素们,插入进去
                List<MyListNode> leafList = result.get(index-1);
                if (leafList == null) {
                    leafList = new ArrayList<>();
                    leafList.add(node.left);
                    result.put(index-1,leafList);
                } else {
                    leafList.add(node.left);
                }
            }
            if (node.right != null) {
                queue.offer(node.right);
                //右边节点的等级+1,此处index的值不能变
                nodeMap.put(node.right,index+1);
                List<MyListNode> leafList = result.get(index+1);
                if (leafList == null) {
                    leafList = new ArrayList<>();
                    leafList.add(node.right);
                    result.put(index+1,leafList);
                } else {
                    leafList.add(node.right);
                }
            }
        }
        return result;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值