二叉搜索树的前序遍历是 15, 10, 12, 11, 20, 18, 16, 19. 以下哪一个是树的后序遍历?
(一) 10、11、12、15、16、18、19、20
(乙) 11、12、10、16、19、18、20、15
(C) 20、19、18、16、15、12、11、10
(四) 19、16、18、20、11、12、10、15答案:(乙)
说明:请参考——Find postorder traversal of BST from preorder traversal
// C++ program for finding postorder
// traversal of BST from preorder traversal
#include
using namespace std;
// Function to find postorder traversal from
// preorder traversal.
void findPostOrderUtil(int pre[], int n, int minval,
int maxval, int& preIndex)
{
// If entire preorder array is traversed then
// return as no more element is left to be
// added to post order array.
if (preIndex == n)
return;
// If array element does not lie in range specified,
// then it is not part of current subtree.
if (pre[preIndex] < minval || pre[preIndex] > maxval) {
return;
}
// Store current value, to be printed later, after
// printing left and right subtrees. Increment
// preIndex to find left and right subtrees,
// and pass this updated value to recursive calls.
int val = pre[preIndex];
preIndex++;
// All elements with value between minval and val
// lie in left subtree.
findPostOrderUtil(pre, n, minval, val, preIndex);
// All elements with value between val and maxval
// lie in right subtree.
findPostOrderUtil(pre, n, val, maxval, preIndex);
cout << val << " ";
}
// Function to find postorder traversal.
void findPostOrder(int pre[], int n)
{
// To store index of element to be
// traversed next in preorder array.
// This is passed by reference to
// utility function.
int preIndex = 0;
findPostOrderUtil(pre, n, INT_MIN, INT_MAX, preIndex);
}
// Driver code
int main()
{
int pre[] = { 15, 10, 12, 11, 20, 18, 16, 19 };
int n = sizeof(pre) / sizeof(pre[0]);
// Calling function
findPostOrder(pre, n);
return 0;
}
代码 – https://ide.geeksforgeeks.org/t49kAtJwr7
选项(B)是正确的。这个问题的测验