Глубина печати при обходе BST после заказа

#c #binary-search-tree #postorder

#c #двоичное дерево поиска #по почтовому заказу

Вопрос:

Итак, прямо сейчас я внедрил обход по порядку, и мне нужно напечатать глубину, на которой находится узел. Итак, если мое дерево представляет собой что-то вроде:

                                   5
                                 / 
                                2   9
                                   /
                                 3 7
  

Затем, когда он печатает 3, он должен иметь глубину 2.
Где я мог бы увеличить глубину, если я вызываю ее рекурсивно.И как бы мне уменьшить ее, если я поднимаюсь по дереву?

Мой код

 void post_order(BST* root,int level)
    if(root == NULL){
        return;
    }
    post_order(root -> left,level); 
    post_order(root -> right, level);
    //Here I would print the node info and depth
}
  

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

Комментарии:

1. пример: post_order(root->left, level 1); по какой причине, подумайте, чем это становится при рекурсивном вызове с позаимствованными root и level значениями соответственно.

Ответ №1:

Нет необходимости увеличивать / уменьшать уровень. Когда вы выполняете рекурсивный вызов, просто передайте значение, которое на единицу больше текущего уровня, когда стек развернется, уровень для предыдущего уровня по-прежнему будет тем значением, которое было до рекурсивного вызова.

Конечно, то, где вы печатаете уровень, будет определять порядок, в котором вы видите уровень, напечатанный по мере обхода дерева.

 void post_order(BST* root,int level)
    if(root == NULL){
        return;
    }
    post_order(root -> left,level   1); 
    post_order(root -> right, level   1);
    //Here I would print the node info and depth
}
  

Ответ №2:

Переменная level поможет вам отслеживать глубину. Если вы передаете значение текущего уровня 1 дочернему уровню каждый раз, когда выполняете рекурсивный вызов, вы получите правильную глубину в каждом узле. В зависимости от того, хотите ли вы, чтобы глубина корня была равна 1 или 0, выполните начальный вызов с корневым узлом и пунктом 2 как 0 или 1.

 void post_order(BST* root,int level)
if(root == NULL){
    return;
}
post_order(root -> left,level 1); 
post_order(root -> right, level 1);
//print node info, depth = level
}
  

Комментарии:

1. Да, логика обхода будет аналогичной. Вам необходимо разместить печать в правильном месте, чтобы обеспечить требуемый порядок обхода.

2. Попробуйте поместить код печати перед рекурсивными вызовами и между вызовами и проверьте результаты!