Convierta un árbol de búsqueda binario en un árbol sesgado en orden creciente o decreciente

Dado un árbol de búsqueda binario y un entero binario K , la tarea es convertir el árbol de búsqueda binario en un árbol sesgado en orden creciente si K = 0 o en orden decreciente si K = 1 .

Ejemplos: 

Input: K = 0, 
           5
          / \
         3   6
Output:
       3
        \
         5
          \
           6

Input: K = 1,
          2
         / \
        1   3
Output:
     3
      \
       2
        \
         1

Acercarse: 

  • La observación clave en el problema es que el primer Node del árbol sesgado será el Node extremo izquierdo o extremo derecho del BST para orden creciente y decreciente respectivamente.
  • Para el orden creciente , necesitamos hacer el recorrido en orden , ya que el recorrido en orden de un BST nos proporciona la secuencia creciente de los valores de los Nodes. Por lo tanto, el orden de recorrido en cada Node será: 
    1. Node izquierdo: recurra a su Node izquierdo si existe, para obtener un valor más pequeño.
    2. Node raíz: después del recorrido completo de su Node/subárbol izquierdo, conecte el Node anterior del árbol sesgado al Node raíz.
    3. Node derecho: recurra al Node derecho si existe, para valores más grandes.
  • Para Orden decreciente , el orden de recorrido en cada Node será: 
    1. Node derecho: recurra a su Node derecho si existe, para obtener valores más grandes.
    2. Node raíz: después del recorrido completo de su Node/subárbol derecho, conecte el Node anterior del árbol sesgado al Node raíz.
    3. Node izquierdo: recurra al Node/subárbol izquierdo para valores más pequeños.
  • De manera similar, al realizar un seguimiento del Node anterior, podemos atravesar el árbol de búsqueda binario según el orden necesario y formar el árbol sesgado.

A continuación se muestra la implementación del enfoque anterior: 

C++14

// C++ implementation to flatten the
// binary search tree into a skewed
// tree in increasing / decreasing order
#include<bits/stdc++.h>
using namespace std;
 
// Class of the node
struct Node
{
    int val;
    Node *left, *right;
 
    Node(int x)
    {
        val = x;
        left = right = NULL;
    }
};
 
Node *prevNode = NULL;
Node *headNode = NULL;
 
// Function to to flatten the binary
// search tree into a skewed tree in
// increasing / decreasing order
void flattenBTToSkewed(Node *root, int order)
{
     
    // Base Case
    if (!root)
        return;
 
    // Condition to check the order
    // in which the skewed tree to
    // maintained
    if (order)
        flattenBTToSkewed(root->right, order);
    else
        flattenBTToSkewed(root->left, order);
 
    Node *rightNode = root->right;
    Node *leftNode = root->left;
 
    // Condition to check if the root Node
    // of the skewed tree is not defined
    if (!headNode)
    {
        headNode = root;
        root->left = NULL;
        prevNode = root;
    }
    else
    {
        prevNode->right = root;
        root->left = NULL;
        prevNode = root;
    }
 
    // Similarly recurse for the left / right
    // subtree on the basis of the order required
    if (order)
        flattenBTToSkewed(leftNode, order);
    else
        flattenBTToSkewed(rightNode, order);
}
 
// Function to traverse the right
// skewed tree using recursion
void traverseRightSkewed(Node *root)
{
    if (!root)
        return;
         
    cout << root->val << " ";
    traverseRightSkewed(root->right);
}
 
// Driver Code
int main()
{
     
    //    5
    //     / \
    //  3   6
    Node *root =new Node(5);
    root->left = new Node(3);
    root->right = new Node(6);
 
    // Order of the Skewed tree can
    // be defined as follows -
    // For Increasing order - 0
    // For Decreasing order - 1
    int order = 0;
 
    flattenBTToSkewed(root, order);
 
    traverseRightSkewed(headNode);
}
 
// This code is contributed by mohit kumar 29

Java

// Java implementation to flatten the
// binary search tree into a skewed
// tree in increasing / decreasing order
import java.io.*;
 
// Class of the node
class Node
{
    int val;
    Node left, right;
    
    // Helper function that allocates a new node
    // with the given data and NULL left and right
    // pointers.
    Node(int item)
    {
        val = item;
        left = right = null;
    }
}
class GFG
{
    public static Node node;
    static Node prevNode = null;
    static Node headNode = null;
   
    // Function to to flatten the binary
    // search tree into a skewed tree in
    // increasing / decreasing order
    static void flattenBTToSkewed(Node root,
                                  int order)
    {
       
        // Base Case
        if(root == null)
        {
            return;
        }
       
        // Condition to check the order
        // in which the skewed tree to
        // maintained
        if(order > 0)
        {
            flattenBTToSkewed(root.right, order);
        }
        else
        {
            flattenBTToSkewed(root.left, order);
        }
        Node rightNode = root.right;
        Node leftNode = root.left;
       
        // Condition to check if the root Node
        // of the skewed tree is not defined
        if(headNode == null)
        {
            headNode = root;
            root.left = null;
            prevNode = root;
        }
        else
        {
            prevNode.right = root;
            root.left = null;
            prevNode = root;
        }
       
        // Similarly recurse for the left / right
        // subtree on the basis of the order required
        if (order > 0)
        {
            flattenBTToSkewed(leftNode, order);
        }
        else
        {
            flattenBTToSkewed(rightNode, order);
        }
    }
   
    // Function to traverse the right
    // skewed tree using recursion
    static void traverseRightSkewed(Node root)
    {
        if(root == null)
        {
            return;
        }
        System.out.print(root.val + " ");
        traverseRightSkewed(root.right);       
    }
   
    // Driver Code
    public static void main (String[] args)
    {
       //    5
       //     / \
       //  3   6
        GFG tree = new GFG();
        tree.node = new Node(5);
        tree.node.left = new Node(3);
        tree.node.right = new Node(6);
       
        // Order of the Skewed tree can
        // be defined as follows -
        // For Increasing order - 0
        // For Decreasing order - 1
        int order = 0;
        flattenBTToSkewed(node, order);
        traverseRightSkewed(headNode);
    }
}
 
// This code is contributed by avanitrachhadiya2155

Python3

# Python3 implementation to flatten
# the binary search tree into a skewed
# tree in increasing / decreasing order
 
# Class of the node
class Node:
     
    # Constructor of node
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
         
prevNode = None
headNode = None
 
# Function to to flatten
# the binary search tree into a skewed
# tree in increasing / decreasing order
def flattenBTToSkewed(root, order):
     
    # Base Case
    if not root:
        return
     
    # Condition to check the order
    # in which the skewed tree to maintained
    if order:
        flattenBTToSkewed(root.right, order)
    else:
        flattenBTToSkewed(root.left, order)
         
    global headNode; global prevNode
    rightNode = root.right
    leftNode = root.left
     
    # Condition to check if the root Node
    # of the skewed tree is not defined
    if not headNode:
        headNode = root
        root.left = None
        prevNode = root
    else:
        prevNode.right = root
        root.left = None
        prevNode = root
     
    # Similarly recurse for the left / right
    # subtree on the basis of the order required
    if order:
        flattenBTToSkewed(leftNode, order)
    else:
        flattenBTToSkewed(rightNode, order)
 
# Function to traverse the right
# skewed tree using recursion
def traverseRightSkewed(root):
    if not root:
        return
    print(root.val, end = " ")
    traverseRightSkewed(root.right)
 
# Driver Code
if __name__ == "__main__":
    # 5
    #      / \
    # 3   6
    root = Node(5)
    root.left = Node(3)
    root.right = Node(6)
     
    prevNode = None
    headNode = None
     
    # Order of the Skewed tree can
    # be defined as follows -
    # For Increasing order - 0
    # For Decreasing order - 1
    order = 0
     
    flattenBTToSkewed(root, order)
     
    traverseRightSkewed(headNode)

C#

// C# implementation to flatten the
// binary search tree into a skewed
// tree in increasing / decreasing order
using System;
 
// Class of the node
class Node
{
    public int val;
    public Node left, right;
     
    // Helper function that allocates a new
    // node with the given data and NULL
    // left and right pointers.
    public Node(int item)
    {
        val = item;
        left = right = null;
    }
}
 
class GFG{
     
public static Node node;
static Node prevNode = null;
static Node headNode = null;
 
// Function to to flatten the binary
// search tree into a skewed tree in
// increasing / decreasing order
static void flattenBTToSkewed(Node root, int order)
{
     
    // Base Case
    if (root == null)
    {
        return;
    }
     
    // Condition to check the order
    // in which the skewed tree to
    // maintained
    if (order > 0)
    {
        flattenBTToSkewed(root.right, order);
    }
    else
    {
        flattenBTToSkewed(root.left, order);
    }
    Node rightNode = root.right;
    Node leftNode = root.left;
    
    // Condition to check if the root Node
    // of the skewed tree is not defined
    if (headNode == null)
    {
        headNode = root;
        root.left = null;
        prevNode = root;
    }
    else
    {
        prevNode.right = root;
        root.left = null;
        prevNode = root;
    }
    
    // Similarly recurse for the left / right
    // subtree on the basis of the order required
    if (order > 0)
    {
        flattenBTToSkewed(leftNode, order);
    }
    else
    {
        flattenBTToSkewed(rightNode, order);
    }
}
 
// Function to traverse the right
// skewed tree using recursion
static void traverseRightSkewed(Node root)
{
    if (root == null)
    {
        return;
    }
    Console.Write(root.val + " ");
    traverseRightSkewed(root.right);
}
 
// Driver Code
static public void Main()
{
     
    //      5
    //     / \
    //    3   6
    GFG.node = new Node(5);
    GFG.node.left = new Node(3);
    GFG.node.right = new Node(6);
     
    // Order of the Skewed tree can
    // be defined as follows -
    // For Increasing order - 0
    // For Decreasing order - 1
    int order = 0;
     
    flattenBTToSkewed(node, order);
    traverseRightSkewed(headNode);
}
}
 
// This code is contributed by rag2127

Javascript

<script>
// Javascript implementation to flatten the
// binary search tree into a skewed
// tree in increasing / decreasing order
 
// Class of the node
class Node
{
    // Helper function that allocates a new node
    // with the given data and NULL left and right
    // pointers.
    constructor(item)
    {
        this.val = item;
        this.left = this.right = null;
    }
}
 
let node;
let prevNode = null;
let headNode = null;
 
// Function to to flatten the binary
    // search tree into a skewed tree in
    // increasing / decreasing order
function flattenBTToSkewed(root,order)
{
    // Base Case
        if(root == null)
        {
            return;
        }
        
        // Condition to check the order
        // in which the skewed tree to
        // maintained
        if(order > 0)
        {
            flattenBTToSkewed(root.right, order);
        }
        else
        {
            flattenBTToSkewed(root.left, order);
        }
        let rightNode = root.right;
        let leftNode = root.left;
        
        // Condition to check if the root Node
        // of the skewed tree is not defined
        if(headNode == null)
        {
            headNode = root;
            root.left = null;
            prevNode = root;
        }
        else
        {
            prevNode.right = root;
            root.left = null;
            prevNode = root;
        }
        
        // Similarly recurse for the left / right
        // subtree on the basis of the order required
        if (order > 0)
        {
            flattenBTToSkewed(leftNode, order);
        }
        else
        {
            flattenBTToSkewed(rightNode, order);
        }
}
 
// Function to traverse the right
    // skewed tree using recursion
function traverseRightSkewed(root)
{
    if(root == null)
        {
            return;
        }
        document.write(root.val + " ");
        traverseRightSkewed(root.right);   
}
 
// Driver Code
 
//    5
       //     / \
       //  3   6
node = new Node(5);
node.left = new Node(3);
node.right = new Node(6);
 
// Order of the Skewed tree can
// be defined as follows -
// For Increasing order - 0
// For Decreasing order - 1
let order = 0;
flattenBTToSkewed(node, order);
traverseRightSkewed(headNode);
 
// This code is contributed by unknown2108
</script>
Producción: 

3 5 6

 

Publicación traducida automáticamente

Artículo escrito por Archit_Dwevedi0 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *