简体   繁体   中英

BST level order traversal

I wanted to print out the BST in level order traversal. But I got the output in this wierd way. Also, I used Java Visualizer to check my algorithm and had no clue since visualizer does not illustrate multiple instances. 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.

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:

在此处输入图像描述

I'm slightly changing your function levelOrder as:

 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>>();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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