简体   繁体   English

N元树广度优先遍历/检查完整或完整

[英]N-ary tree breadth first traversal / check complete or full

在此处输入图片说明

class Node {
  Node subtree, next;
  int data;

  public Node(int _data) {
    subtree = null;
    next = null;
    data = _data;

  }
}


class listTree {
  private Node root;
  public listTree() {
    root = null;
  }

  public static final Scanner sc = new Scanner(System.in);

  public void display(Node r) {
    if (r != null)
      System.out.print("Current: " + r.data + " ");
    if (r.subtree == null)
      System.out.print("Down: null ");
    else
      System.out.print("Down: " + r.subtree.data + " ");
    if (r.next == null)
      System.out.println("Next: " + null);
    else
      System.out.println("Next: " +r.next.data);
  }

  public Node addRoot(int r) {
    root.data = r;
    return root;
  }

  public void addChild(int c) {
    root = addChild(root, c);
  }

  private Node addChild(Node node, int c) {
    char ch= 'x';
    if (node == null)
          node = new Node(c);
    else {
      do {
        display(node);
        System.out.println("[D]own or [N]ext?");
        ch = sc.next().charAt(0);
        if (ch == 'n' || ch == 'N')
          node.next = addChild(node.next, c);
        else if (ch == 'd' || ch == 'D')
          node.subtree = addChild(node.subtree, c);
        else
          System.out.print("Invalid input. No movement made. ");
      } while ((ch != 'd') && (ch != 'D') && (ch != 'n') && (ch != 'N'));
    }
    return node;
  }

  public void postOrderTraversal() {
    postOrderTraversal(root);
  }

  private void postOrderTraversal(Node r)
  {    
    if (r != null) {
      postOrderTraversal(r.subtree);
      System.out.print(r.data +" ");
      postOrderTraversal(r.next);
    }
  }

  public void preOrderTraversal() {
    preOrderTraversal(root);
  }

  private void preOrderTraversal(Node r) {
    if (r != null) {
      System.out.print(r.data +" ");
      preOrderTraversal(r.subtree);
      preOrderTraversal(r.next);
    }
  }

  public void breathFirstTraversal(){
    breathFirstTraversal(root);
  }

  private void breathFirstTraversal(Node root) {
    Queue<Node> queue = new LinkedList<Node>();
    if (root == null)
        return;
    queue.clear();
    queue.add(root);
    while(!queue.isEmpty()){
        Node node = queue.remove();
        System.out.print(node.data + " ");
        if(node.next != null) queue.add(node.next);
        if(node.subtree != null) queue.add(node.subtree);
    }
  }

  private boolean checkComple(Node node) {

}

public class treeAssignment {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    listTree lt = new listTree();
    do {
      System.out.println("Enter integer element:");
      lt.addChild(sc.nextInt());
      System.out.println("Done? Y/N");
    } while (sc.next().charAt(0) == 'n');
    System.out.println("PostOrder Traversal:");
    lt.postOrderTraversal();
    System.out.println();
    System.out.println("PreOrder Traversal:");
    lt.preOrderTraversal();
    System.out.println();
    lt.breathFirstTraversal();
  }
}

Trying to figure out how to implement a breath first traversal method given the structure of the n-ary tree in the picture.给定图中n元树的结构,试图弄清楚如何实现呼吸优先遍历方法。

Implementing a tree into LL is questionable idea.将树实现到 LL 中是有问题的想法。 I would strongly suggest looking into Graphs it is a better option for something like this.我强烈建议查看 Graphs,它是此类问题的更好选择。

Here is an example read: http://www.geeksforgeeks.org/breadth-first-traversal-for-a-graph/这是一个例子: http : //www.geeksforgeeks.org/breadth-first-traversal-for-a-graph/

So basically a node points to its direct right sibling, and it can also point to its leftmost child node.所以基本上一个节点指向它的直接右兄弟节点,它也可以指向它最左边的子节点。 A BFS is simple to implement, it's the same idea for a BFS of a binary tree with some minor modifications. BFS 很容易实现,它与二叉树的 BFS 的想法相同,只是做了一些小的修改。

Deque<Node> queue = new ArrayDeque<Node>();
queue.add(root);
while(!queue.isEmpty()) {
    Node node = queue.poll();
    while (node != null) {
        System.out.println(node.data);
        if (node.subtree != null) {
            queue.add(node.subtree); // to visit the nodes on the next level
        }
        node = node.next; // to visit the other nodes on the same level
    }
}

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

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