Create a wave array from the given Binary Search Tree
Given a Binary Search Tree, the task is to create a wave array from the given Binary Search Tree. An array arr[0..n-1] is called a wave array if arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= …
Examples:
Input:
Output: 4 2 8 6 12 10 14
Explanation: The above mentioned array {4, 2, 8, 6, 12, 10, 14} is one of the many valid wave arrays.
Input:
Output: 4 2 8 6 12
Approach: The given problem can be solved by the observation that the Inorder Traversal of the Binary Search Tree gives nodes in non-decreasing order. Therefore, store the inorder traversal of the given tree into a vector. Since the vector contains elements in sorted order, it can be converted into a wave array by swapping the adjacent elements for all elements in the range [0, N) using the approach discussed in this article.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node* right;
Node* left;
Node( int data)
{
this ->data = data;
this ->left = NULL;
this ->right = NULL;
}
};
void toWaveArray(Node* root)
{
vector< int > waveArr;
stack<Node*> s;
Node* curr = root;
while (curr != NULL || s.empty() == false ) {
while (curr != NULL) {
s.push(curr);
curr = curr->left;
}
curr = s.top();
s.pop();
waveArr.push_back(curr->data);
curr = curr->right;
}
for ( int i = 0;
i + 1 < waveArr.size(); i += 2) {
swap(waveArr[i], waveArr[i + 1]);
}
for ( int i = 0; i < waveArr.size(); i++) {
cout << waveArr[i] << " " ;
}
}
int main()
{
Node* root = new Node(8);
root->left = new Node(4);
root->right = new Node(12);
root->right->left = new Node(10);
root->right->right = new Node(14);
root->left->left = new Node(2);
root->left->right = new Node(6);
toWaveArray(root);
return 0;
}
|
Java
import java.util.*;
class GFG{
static class Node {
int data;
Node right;
Node left;
Node( int data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
};
static void toWaveArray(Node root)
{
Vector<Integer> waveArr = new Vector<>();
Stack<Node> s = new Stack<>();
Node curr = root;
while (curr != null || s.isEmpty() == false ) {
while (curr != null ) {
s.add(curr);
curr = curr.left;
}
curr = s.peek();
s.pop();
waveArr.add(curr.data);
curr = curr.right;
}
for ( int i = 0 ; i + 1 < waveArr.size(); i += 2 ) {
int t = waveArr.get(i);
waveArr.set(i, waveArr.get(i+ 1 ));
waveArr.set(i+ 1 , t);
}
for ( int i = 0 ; i < waveArr.size(); i++) {
System.out.print(waveArr.get(i)+ " " );
}
}
public static void main(String[] args)
{
Node root = new Node( 8 );
root.left = new Node( 4 );
root.right = new Node( 12 );
root.right.left = new Node( 10 );
root.right.right = new Node( 14 );
root.left.left = new Node( 2 );
root.left.right = new Node( 6 );
toWaveArray(root);
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data;
self .right = None ;
self .left = None ;
def toWaveArray(root):
waveArr = [];
s = [];
curr = root;
while (curr ! = None or len (s) ! = 0 ):
while (curr ! = None ):
s.append(curr);
curr = curr.left;
curr = s.pop();
waveArr.append(curr.data);
curr = curr.right;
for i in range ( 0 , len (waveArr) - 1 , 2 ):
t = waveArr[i];
waveArr[i] = waveArr[i + 1 ];
waveArr[i + 1 ] = t;
for i in range ( len (waveArr)):
print (waveArr[i], end = " " );
if __name__ = = '__main__' :
root = Node( 8 );
root.left = Node( 4 );
root.right = Node( 12 );
root.right.left = Node( 10 );
root.right.right = Node( 14 );
root.left.left = Node( 2 );
root.left.right = Node( 6 );
toWaveArray(root);
|
C#
using System;
using System.Collections.Generic;
public class GFG{
public class Node {
public int data;
public Node right;
public Node left;
public Node( int data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
};
static void toWaveArray(Node root)
{
List< int > waveArr = new List< int >();
Stack<Node> s = new Stack<Node>();
Node curr = root;
while (curr != null || s.Count!=0 ) {
while (curr != null ) {
s.Push(curr);
curr = curr.left;
}
curr = s.Peek();
s.Pop();
waveArr.Add(curr.data);
curr = curr.right;
}
for ( int i = 0; i + 1 < waveArr.Count; i += 2) {
int t = waveArr[i];
waveArr[i]= waveArr[i+1];
waveArr[i+1]= t;
}
for ( int i = 0; i < waveArr.Count; i++) {
Console.Write(waveArr[i]+ " " );
}
}
public static void Main(String[] args)
{
Node root = new Node(8);
root.left = new Node(4);
root.right = new Node(12);
root.right.left = new Node(10);
root.right.right = new Node(14);
root.left.left = new Node(2);
root.left.right = new Node(6);
toWaveArray(root);
}
}
|
Javascript
<script>
class Node {
constructor(data) {
this .data = data;
this .left = this .right = null ;
}
}
function toWaveArray(root) {
let waveArr = [];
let s = [];
let curr = root;
while (curr != null || s.length != 0) {
while (curr != null ) {
s.push(curr);
curr = curr.left;
}
curr = s[s.length - 1];
s.pop();
waveArr.push(curr.data);
curr = curr.right;
}
for (let i = 0;
i + 1 < waveArr.length; i += 2) {
let temp = waveArr[i]
waveArr[i] = waveArr[i + 1]
waveArr[i + 1] = temp
}
for (let i = 0; i < waveArr.length; i++) {
document.write(waveArr[i] + " " );
}
}
let root = new Node(8);
root.left = new Node(4);
root.right = new Node(12);
root.right.left = new Node(10);
root.right.right = new Node(14);
root.left.left = new Node(2);
root.left.right = new Node(6);
toWaveArray(root);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Last Updated :
25 Feb, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...