zoukankan      html  css  js  c++  java
  • 垂直遍历二叉树(java版)

    看到有的博客用使用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中就是最后的结果了!!!

  • 相关阅读:
    12 python json&pickle&shelve模块
    11 python shutil 模块
    10 python os&sys 模块
    9 random模块
    8 python time$datetime
    7 python 模块间相互导入
    6 unit3-文件操作&函数 review
    3 Python 函数介绍
    hibernate课程 初探单表映射2-6 session详解(下)
    hibernate课程 初探单表映射2-5 session详解(上)
  • 原文地址:https://www.cnblogs.com/kevin-lee123/p/11522395.html
Copyright © 2011-2022 走看看