给定二进制搜索树(BST),任务是以最小-最大方式打印BST。
什么是最小最大时尚?
最小-最大方式意味着您必须先打印最大节点,然后再打印最小节点,然后再打印第二个最大值,然后再打印第二个最小值,依此类推。
例子:
Input:
100
/ \
20 500
/ \
10 30
\
40
Output: 10 500 20 100 30 40
Input:
40
/ \
20 50
/ \ \
10 35 60
/ /
25 55
Output: 10 60 20 55 25 50 35 40
方法:
- 创建一个数组inorder []并存储givrn二进制搜索树的有序遍历。
- 由于二叉搜索树的有序遍历是按升序排序的,因此初始化i = 0且j = n – 1 。
- 打印inorder [i]并更新i = i + 1 。
- 打印inorder [j]并更新j = j – 1 。
- 重复步骤3和4,直到所有元素都已打印。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Structure of each node of BST
struct node {
int key;
struct node *left, *right;
};
// A utility function to create a new BST node
node* newNode(int item)
{
node* temp = new node();
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
/* A utility function to insert a new
node with given key in BST */
struct node* insert(struct node* node, int key)
{
/* If the tree is empty, return a new node */
if (node == NULL)
return newNode(key);
/* Otherwise, recur down the tree */
if (key < node->key)
node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key);
/* return the (unchanged) node pointer */
return node;
}
// Function to return the size of the tree
int sizeOfTree(node* root)
{
if (root == NULL) {
return 0;
}
// Calculate left size recursively
int left = sizeOfTree(root->left);
// Calculate right size recursively
int right = sizeOfTree(root->right);
// Return total size recursively
return (left + right + 1);
}
// Utility function to print the
// Min max order of BST
void printMinMaxOrderUtil(node* root, int inOrder[],
int& index)
{
// Base condition
if (root == NULL) {
return;
}
// Left recursive call
printMinMaxOrderUtil(root->left, inOrder, index);
// Store elements in inorder array
inOrder[index++] = root->key;
// Right recursive call
printMinMaxOrderUtil(root->right, inOrder, index);
}
// Function to print the
// Min max order of BST
void printMinMaxOrder(node* root)
{
// Store the size of BST
int numNode = sizeOfTree(root);
// Take auxiliary array for storing
// The inorder traversal of BST
int inOrder[numNode + 1];
int index = 0;
// Function call for printing
// element in min max order
printMinMaxOrderUtil(root, inOrder, index);
int i = 0;
index--;
// While loop for printing elements
// In front last order
while (i < index) {
cout << inOrder[i++] << " "
<< inOrder[index--] << " ";
}
if (i == index) {
cout << inOrder[i] << endl;
}
}
// Driver code
int main()
{
struct node* root = NULL;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
printMinMaxOrder(root);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Structure of each node of BST
static class node
{
int key;
node left, right;
};
static int index;
// A utility function to create a new BST node
static node newNode(int item)
{
node temp = new node();
temp.key = item;
temp.left = temp.right = null;
return temp;
}
/* A utility function to insert a new
node with given key in BST */
static node insert(node node, int key)
{
/* If the tree is empty,
return a new node */
if (node == null)
return newNode(key);
/* Otherwise, recur down the tree */
if (key < node.key)
node.left = insert(node.left, key);
else if (key > node.key)
node.right = insert(node.right, key);
/* return the (unchanged) node pointer */
return node;
}
// Function to return the size of the tree
static int sizeOfTree(node root)
{
if (root == null)
{
return 0;
}
// Calculate left size recursively
int left = sizeOfTree(root.left);
// Calculate right size recursively
int right = sizeOfTree(root.right);
// Return total size recursively
return (left + right + 1);
}
// Utility function to print the
// Min max order of BST
static void printMinMaxOrderUtil(node root,
int inOrder[])
{
// Base condition
if (root == null)
{
return;
}
// Left recursive call
printMinMaxOrderUtil(root.left, inOrder);
// Store elements in inorder array
inOrder[index++] = root.key;
// Right recursive call
printMinMaxOrderUtil(root.right, inOrder);
}
// Function to print the
// Min max order of BST
static void printMinMaxOrder(node root)
{
// Store the size of BST
int numNode = sizeOfTree(root);
// Take auxiliary array for storing
// The inorder traversal of BST
int []inOrder = new int[numNode + 1];
// Function call for printing
// element in min max order
printMinMaxOrderUtil(root, inOrder);
int i = 0;
index--;
// While loop for printing elements
// In front last order
while (i < index)
{
System.out.print(inOrder[i++] + " " +
inOrder[index--] + " ");
}
if (i == index)
{
System.out.println(inOrder[i]);
}
}
// Driver code
public static void main(String[] args)
{
node root = null;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
printMinMaxOrder(root);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 implementation of the approach
# Structure of each node of BST
class Node:
def __init__(self,key):
self.left = None
self.right = None
self.val = key
def insert(root,node):
if root is None:
root = Node(node)
else:
if root.val < node:
if root.right is None:
root.right = Node(node)
else:
insert(root.right, node)
else:
if root.left is None:
root.left = Node(node)
else:
insert(root.left, node)
# Function to return the size of the tree
def sizeOfTree(root):
if root == None:
return 0
# Calculate left size recursively
left = sizeOfTree(root.left)
# Calculate right size recursively
right = sizeOfTree(root.right);
# Return total size recursively
return (left + right + 1)
# Utility function to print the
# Min max order of BST
def printMinMaxOrderUtil(root, inOrder, index):
# Base condition
if root == None:
return
# Left recursive call
printMinMaxOrderUtil(root.left, inOrder, index)
# Store elements in inorder array
inOrder[index[0]] = root.val
index[0] += 1
# Right recursive call
printMinMaxOrderUtil(root.right, inOrder, index)
# Function to print the
# Min max order of BST
def printMinMaxOrder(root):
# Store the size of BST
numNode = sizeOfTree(root);
# Take auxiliary array for storing
# The inorder traversal of BST
inOrder = [0] * (numNode + 1)
index = 0
# Function call for printing
# element in min max order
ref = [index]
printMinMaxOrderUtil(root, inOrder, ref)
index = ref[0]
i = 0;
index -= 1
# While loop for printing elements
# In front last order
while (i < index):
print (inOrder[i], inOrder[index], end = ' ')
i += 1
index -= 1
if i == index:
print(inOrder[i])
# Driver Code
root = Node(50)
insert(root, 30)
insert(root, 20)
insert(root, 40)
insert(root, 70)
insert(root, 60)
insert(root, 80)
printMinMaxOrder(root)
# This code is contributed by Sadik Ali
C#
// C# implementation of the approach
using System;
class GFG
{
// Structure of each node of BST
class node
{
public int key;
public node left, right;
};
static int index;
// A utility function to create a new BST node
static node newNode(int item)
{
node temp = new node();
temp.key = item;
temp.left = temp.right = null;
return temp;
}
/* A utility function to insert a new
node with given key in BST */
static node insert(node node, int key)
{
/* If the tree is empty,
return a new node */
if (node == null)
return newNode(key);
/* Otherwise, recur down the tree */
if (key < node.key)
node.left = insert(node.left, key);
else if (key > node.key)
node.right = insert(node.right, key);
/* return the (unchanged) node pointer */
return node;
}
// Function to return the size of the tree
static int sizeOfTree(node root)
{
if (root == null)
{
return 0;
}
// Calculate left size recursively
int left = sizeOfTree(root.left);
// Calculate right size recursively
int right = sizeOfTree(root.right);
// Return total size recursively
return (left + right + 1);
}
// Utility function to print the
// Min max order of BST
static void printMinMaxOrderUtil(node root,
int []inOrder)
{
// Base condition
if (root == null)
{
return;
}
// Left recursive call
printMinMaxOrderUtil(root.left, inOrder);
// Store elements in inorder array
inOrder[index++] = root.key;
// Right recursive call
printMinMaxOrderUtil(root.right, inOrder);
}
// Function to print the
// Min max order of BST
static void printMinMaxOrder(node root)
{
// Store the size of BST
int numNode = sizeOfTree(root);
// Take auxiliary array for storing
// The inorder traversal of BST
int []inOrder = new int[numNode + 1];
// Function call for printing
// element in min max order
printMinMaxOrderUtil(root, inOrder);
int i = 0;
index--;
// While loop for printing elements
// In front last order
while (i < index)
{
Console.Write(inOrder[i++] + " " +
inOrder[index--] + " ");
}
if (i == index)
{
Console.WriteLine(inOrder[i]);
}
}
// Driver code
public static void Main(String[] args)
{
node root = null;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
printMinMaxOrder(root);
}
}
// This code is contributed by PrinciRaj1992
输出:
20 80 30 70 40 60 50