简体   繁体   English

BST级订单遍历

[英]BST level order traversal

I wanted to print out the BST in level order traversal.我想以水平顺序遍历打印出 BST。 But I got the output in this wierd way.但是我以这种奇怪的方式得到了 output。 Also, I used Java Visualizer to check my algorithm and had no clue since visualizer does not illustrate multiple instances.此外,我使用 Java Visualizer 来检查我的算法并且没有任何线索,因为 Visualizer 没有说明多个实例。 I'm thinking that it is either my variable tmp is not added into my ArrayList instance set properly or set is not added into ArrayList<ArrayList<Integer>> solution properly.我在想,要么是我的变量tmp未正确添加到我的ArrayList实例set set ,要么未正确添加到ArrayList<ArrayList<Integer>> solution

import java.util.LinkedList;
import java.util.Queue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Arrays;

public class BSTordertraversal{

  public static class TreeNode{
    int value;
    TreeNode left;
    TreeNode right;
    public TreeNode(int value){
      this.value=value;
    }
  }
  public static ArrayList<ArrayList<Integer>> levelOrder(TreeNode root){
    HashMap<TreeNode,Integer> map = new HashMap<>();
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    ArrayList<Integer> set = new ArrayList<>();
    ArrayList<ArrayList<Integer>> solution = new ArrayList<ArrayList<Integer>>();
    queue.add(root);
    int lastlvl = 0;
    map.put(root,0);
    if(root==null){
      return solution;
    }
    int tmp;
    while(queue.peek()!=null){
      TreeNode current = queue.peek();
      if(current.left!=null){
        queue.add(current.left);
        map.put(current.left, map.get(current)+1);
      }
      if(current.right!=null){
        queue.add(current.right);
        map.put(current.right, map.get(current)+1);
      }
      if(map.get(current)==lastlvl){
        tmp = current.value;
        set.add(tmp);
        queue.remove();
      }else if(map.get(current)>lastlvl){
        solution.add(set);
        set.clear();
        tmp = current.value;
        set.add(tmp);
        lastlvl=map.get(current);
        queue.remove();
      }
    }
    return solution;
  }

  public static void main(String[] args) {
    TreeNode root = new TreeNode(3);
    root.left = new TreeNode(9);
    root.right = new TreeNode(20);
    //root.left.left = new TreeNode(null);
    //root.left.right= new TreeNode(null);
    root.right.left = new TreeNode(15);
    root.right.right= new TreeNode(7);
    //root.right.right.right = new TreeNode(30);
    ArrayList<ArrayList<Integer>> solution = levelOrder(root);
    System.out.println("[");
    for(int i=0;i<solution.size();i++){
      System.out.print("[");
      for(int x=0;x<solution.get(i).size();x++){
        System.out.print(solution.get(i).get(x));
      }
      System.out.print("]");
    }
    System.out.println("");
    System.out.println("]");
  }
}

Here is the output:这是 output:

在此处输入图像描述

I'm slightly changing your function levelOrder as:我将您的 function levelOrder稍微更改为:

 public static ArrayList<Integer> levelOrder(TreeNode root){
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        ArrayList<Integer> levelOrderData =  new ArrayList<>();
        queue.add(root);
        while(!queue.isEmpty())
        {
            TreeNode tempNode=queue.poll();
            levelOrderData.add(tempNode.value);
            if(tempNode.left!=null)
                queue.add(tempNode.left);
            if(tempNode.right!=null)
                queue.add(tempNode.right);
        }
        return levelOrderData;
  }

This is unnessesary:这是不必要的:

  ArrayList<ArrayList<Integer>> solution = new ArrayList<ArrayList<Integer>>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM