簡體   English   中英

BST級訂單遍歷

[英]BST level order traversal

我想以水平順序遍歷打印出 BST。 但是我以這種奇怪的方式得到了 output。 此外,我使用 Java Visualizer 來檢查我的算法並且沒有任何線索,因為 Visualizer 沒有說明多個實例。 我在想,要么是我的變量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("]");
  }
}

這是 output:

在此處輸入圖像描述

我將您的 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;
  }

這是不必要的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM