垂直遍历二叉树(java版)

牧云@^-^@ 提交于 2019-11-29 16:25:53

看到有的博客用使用C++写的,但是没有java版本的,所以在这里做一个补充。

import baseclass.TreeNode;
import javafx.util.Pair;
import java.util.*;
/**
 * 垂直遍历二叉树
 */
public class straightTree {
    public static void main(String[] args){       //这里的TreeNode是自己定义的一个树节点的类
        TreeNode head = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
//        TreeNode node2 = new TreeNode(3);
        head.left = node1;
//        head.right = node2;        //queue用于存放相同“数值”(后面会将是什么东西)和TreeNode,就是平时的层次遍历
        Queue<Pair<Integer,TreeNode>> queue = new LinkedList<>();     //set用来顺序存放“数值”,方便后面的遍历
        Set<Integer> set = new TreeSet<>();     //key是“数值”,value是TreeNode
        Pair pair = new Pair(0,head);
        queue.offer(pair);        //map用来存放相同“数值”,的所有对应的TreeNode
        Map<Integer, List<TreeNode>> map = new HashMap<>();        //这里就是存放结果啦
        List<List<TreeNode>> res = new ArrayList<>();         //层次遍历
        while(!queue.isEmpty()){
            Pair<Integer,TreeNode> tempPair = queue.peek();
            int key = tempPair.getKey();
            TreeNode value = tempPair.getValue();
            queue.poll();
            set.add(key);
            List<TreeNode> tempList = map.getOrDefault(key,new ArrayList<TreeNode>());
            tempList.add(value);
            map.put(key,tempList);
            if(value.left!=null)queue.offer(new Pair<>(key-1,value.left));
            if(value.right!=null) queue.offer((new Pair<>(key+1,value.right)));
        }
        for(int i:set){
            res.add(map.get(i));
        }
        for(List<TreeNode> node:res){
            System.out.println(node.get(0).val);
        }
    }
}最后将一下思路:首先将根节点的“数值”置为0,左节点为-1,右节点为+1,以此类推,将这些数值相同的节点统一放在map的value里面,然后之所以还用用到一个set是因为map是根据key的hash值存储的,所以直接遍历key肯定不是自然顺序,所以就加了一个TreeSet,遍历后放到res中就是最后的结果了!!!

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!