Как распечатать дерево по порядку, используя поиск по стопке и глубине?

import java.util.LinkedList;
import java.util.Queue;

class Node {
public int iData; // data item (key)
public double dData; // data item
public Node leftChild; // this node's left child
public Node rightChild; // this node's right child
public int level;
public boolean flag;

public void displayNode() // display ourself
{
    System.out.print('{');
    System.out.print(level);
    System.out.print(", ");
    System.out.print(iData);
    System.out.print(", ");
    System.out.print(dData);
    System.out.print("} ");
    System.out.println(" ");
}
} // end class Node
// //////////////////////////////////////////////////////////////

class Tree {
private Node root; // first node of tree

// -------------------------------------------------------------
public Tree() // constructor
{
root = null;
} // no nodes in tree yet
// -------------------------------------------------------------

public void insert(int id, double dd) {
Node newNode = new Node(); // make new node
newNode.iData = id; // insert data
newNode.dData = dd;
if (root == null) // no node in root
    root = newNode;
else // root occupied
{
    Node current = root; // start at root
    Node parent;
    while (true) // (exits internally)
    {
        parent = current;
        if (id < current.iData) // go left?
        {
            current = current.leftChild;
            if (current == null) // if end of the line,
            { // insert on left
                parent.leftChild = newNode;
                return;
            }
        } // end if go left
        else // or go right?
        {
            current = current.rightChild;
            if (current == null) // if end of the line
            { // insert on right
                parent.rightChild = newNode;
                return;
            }
        } // end else go right
    } // end while
} // end else not root
} // end insert()
// -------------------------------------------------------------

public void breadthFirstDisplay() {
    Queue newQueue = new LinkedList();
    int level = 0;
    newQueue.add(root);
    int temp = root.iData;
    while (!newQueue.isEmpty()) {
        Node theNode = (Node) newQueue.remove();
        if (temp > theNode.iData)
            level++;
        theNode.level = level;
        theNode.displayNode();
        temp = theNode.iData;
        if (theNode.leftChild != null) {
            newQueue.add(theNode.leftChild);
        }
        if (theNode.rightChild != null) {
            newQueue.add(theNode.rightChild);
        }
    }
}

public void depthFirstStackDisplay() {

}
// -------------------------------------------------------------
} // end class Tree
// //////////////////////////////////////////////////////////////

class TreeApp {
public static void main(String[] args){
Tree theTree = new Tree();

theTree.insert(5, 1.5);
theTree.insert(4, 1.2);
theTree.insert(6, 1.7);
theTree.insert(9, 1.5);
theTree.insert(1, 1.2);
theTree.insert(2, 1.7);
theTree.insert(3, 1.5);
theTree.insert(7, 1.2);
theTree.insert(8, 1.7);

theTree.breadthFirstDisplay();
theTree.depthFirstStackDisplay();

}// -------------------------------------------------------------
} // end class TreeApp
// //////////////////////////////////////////////////////////////

Я хочу написать функцию поиска по глубине, чтобы результат составил 1,2,3,4,5,6,7,8,9

Логический флаг установлен в классе Node, и я хочу, чтобы функция была похожа на поиск в ширину.

Я не могу найти соответствующий источник, чтобы помочь мне завершить его.

1 ответ

Вы можете попробовать этот алгоритм для печати первого обхода глубины (обход в соответствии с вашей задачей). Он будет использовать стек.

1) Создайте пустой стек S.

2) Инициализировать текущий узел как root

3) Нажмите текущий узел на S и установите current = current->left, пока current не станет NULL

4) Если ток равен NULL и стек не пуст

 a) Pop the top item from stack.

 b) Print the popped item, set current = popped_item->right 

 c) Go to step 3.

5) Если current равен NULL и стек пуст, то все готово.

Я не знаю много о Java, но вы можете воспользоваться помощью этого кода C:

    /* Iterative function for inorder tree traversal */
void inOrder(struct Node *root)
{
  /* set current to root of binary tree */
  struct Node *current = root;
  struct sNode *s = NULL;  /* Initialize stack s */
  bool done = 0;

  while (!done)
  {
    /* Reach the left most Node of the current Node */
    if(current !=  NULL)
    {
      /* place pointer to a tree node on the stack before traversing
        the node's left subtree */
      push(&s, current);                                              
      current = current->leftChild; 
    }

    /* backtrack from the empty subtree and visit the Node
       at the top of the stack; however, if the stack is empty,
      you are done */
    else                                                             
    {
      if (!isEmpty(s))
      {
        current = pop(&s);
        printf("%d ", current->idata);

        /* we have visited the node and its left subtree.
          Now, it's right subtree's turn */
        current = current->rightChild;
      }
      else
        done = 1;
    }
  } /* end of while */ 
}     
Другие вопросы по тегам