Modifique un árbol binario para obtener un recorrido de orden anticipado usando solo punteros a la derecha

Dado un árbol binario. Modifíquelo de tal manera que después de la modificación pueda tener un recorrido de orden anticipado utilizando solo los punteros correctos. Durante la modificación, puede usar punteros tanto a la derecha como a la izquierda. 
Ejemplos: 
 

Input :    10
          /   \
        8      2
      /  \    
    3     5  
Output :    10
              \
               8
                \ 
                 3
                  \
                   5
                    \
                     2
Explanation : The preorder traversal
of given binary tree is 10 8 3 5 2.

C++

// C code to modify binary tree for
// traversal using only right pointer
#include <bits/stdc++.h>
  
using namespace std;
  
// A binary tree node has data,
// left child and right child
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};
  
// function that allocates a new node
// with the given data and NULL left
// and right pointers.
struct Node* newNode(int data)
{
    struct Node* node = new struct Node;
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return (node);
}
  
// Function to modify tree
struct Node* modifytree(struct Node* root)
{
    struct Node* right = root->right;
    struct Node* rightMost = root;
  
    // if the left tree exists
    if (root->left) {
  
        // get the right-most of the
        // original left subtree
        rightMost = modifytree(root->left);
  
        // set root right to left subtree
        root->right = root->left;
        root->left = NULL;
    }
  
    // if the right subtree does
    // not exists we are done!
    if (!right) 
        return rightMost;
  
    // set right pointer of right-most
    // of the original left subtree
    rightMost->right = right;
  
    // modify the rightsubtree
    rightMost = modifytree(right);
    return rightMost;
}
  
// printing using right pointer only
void printpre(struct Node* root)
{
    while (root != NULL) {
        cout << root->data << " ";
        root = root->right;
    }
}
  
// Driver program to test above functions
int main()
{
    /* Constructed binary tree is
         10
        / \
       8   2
      / \  
     3   5     */
    struct Node* root = newNode(10);
    root->left = newNode(8);
    root->right = newNode(2);
    root->left->left = newNode(3);
    root->left->right = newNode(5);
  
    modifytree(root);
    printpre(root);
  
    return 0;
}

Java

// Java code to modify binary tree for 
// traversal using only right pointer 
class GFG
{
  
// A binary tree node has data, 
// left child and right child 
static class Node 
{ 
    int data; 
    Node left; 
    Node right; 
}; 
  
// function that allocates a new node 
// with the given data and null left 
// and right pointers. 
static Node newNode(int data) 
{ 
    Node node = new Node(); 
    node.data = data; 
    node.left = null; 
    node.right = null; 
    return (node); 
} 
  
// Function to modify tree 
static Node modifytree( Node root) 
{ 
    Node right = root.right; 
    Node rightMost = root; 
  
    // if the left tree exists 
    if (root.left != null) 
    { 
  
        // get the right-most of the 
        // original left subtree 
        rightMost = modifytree(root.left); 
  
        // set root right to left subtree 
        root.right = root.left; 
        root.left = null; 
    } 
  
    // if the right subtree does 
    // not exists we are done! 
    if (right == null) 
        return rightMost; 
  
    // set right pointer of right-most 
    // of the original left subtree 
    rightMost.right = right; 
  
    // modify the rightsubtree 
    rightMost = modifytree(right); 
    return rightMost; 
} 
  
// printing using right pointer only 
static void printpre( Node root) 
{ 
    while (root != null) 
    { 
        System.out.print( root.data + " "); 
        root = root.right; 
    } 
} 
  
// Driver cde 
public static void main(String args[]) 
{ 
    /* Constructed binary tree is 
        10 
        / \ 
    8 2 
    / \ 
    3 5 */
    Node root = newNode(10); 
    root.left = newNode(8); 
    root.right = newNode(2); 
    root.left.left = newNode(3); 
    root.left.right = newNode(5); 
  
    modifytree(root); 
    printpre(root); 
}
} 
  
// This code is contributed by Arnab Kundu

Python3

# Python code to modify binary tree for 
# traversal using only right pointer 
  
class newNode(): 
  
    def __init__(self, data): 
        self.data = data
        self.left = None
        self.right = None
          
          
# Function to modify tree 
def modifytree(root):
  
    right = root.right 
    rightMost = root 
  
    # if the left tree exists 
    if (root.left):
  
        # get the right-most of the 
        # original left subtree 
        rightMost = modifytree(root.left) 
  
        # set root right to left subtree 
        root.right = root.left 
        root.left = None
      
  
    # if the right subtree does 
    # not exists we are done! 
    if (not right):
        return rightMost 
  
    # set right pointer of right-most 
    # of the original left subtree 
    rightMost.right = right 
  
    # modify the rightsubtree 
    rightMost = modifytree(right) 
    return rightMost 
  
  
# printing using right pointer only 
def printpre(root):
  
    while (root != None):
        print(root.data,end=" ")
        root = root.right 
          
# Driver code
if __name__ == '__main__':
    """ Constructed binary tree is
    10 
        / \ 
    8 2 
    / \ 
    3 5     """
    root = newNode(10) 
    root.left = newNode(8) 
    root.right = newNode(2) 
    root.left.left = newNode(3) 
    root.left.right = newNode(5) 
  
    modifytree(root) 
    printpre(root)
  
# This code is contributed by SHUBHAMSINGH10

C#

// C# code to modify binary tree for 
// traversal using only right pointer
using System;
      
class GFG
{
  
// A binary tree node has data, 
// left child and right child 
public class Node 
{ 
    public int data; 
    public Node left; 
    public Node right; 
}; 
  
// function that allocates a new node 
// with the given data and null left 
// and right pointers. 
static Node newNode(int data) 
{ 
    Node node = new Node(); 
    node.data = data; 
    node.left = null; 
    node.right = null; 
    return (node); 
} 
  
// Function to modify tree 
static Node modifytree( Node root) 
{ 
    Node right = root.right; 
    Node rightMost = root; 
  
    // if the left tree exists 
    if (root.left != null) 
    { 
  
        // get the right-most of the 
        // original left subtree 
        rightMost = modifytree(root.left); 
  
        // set root right to left subtree 
        root.right = root.left; 
        root.left = null; 
    } 
  
    // if the right subtree does 
    // not exists we are done! 
    if (right == null) 
        return rightMost; 
  
    // set right pointer of right-most 
    // of the original left subtree 
    rightMost.right = right; 
  
    // modify the rightsubtree 
    rightMost = modifytree(right); 
    return rightMost; 
} 
  
// printing using right pointer only 
static void printpre( Node root) 
{ 
    while (root != null) 
    { 
        Console.Write( root.data + " "); 
        root = root.right; 
    } 
} 
  
// Driver cde 
public static void Main(String []args) 
{ 
    /* Constructed binary tree is 
        10 
        / \ 
    8 2 
    / \ 
    3 5 */
    Node root = newNode(10); 
    root.left = newNode(8); 
    root.right = newNode(2); 
    root.left.left = newNode(3); 
    root.left.right = newNode(5); 
  
    modifytree(root); 
    printpre(root); 
}
}
  
// This code is contributed by 29AjayKumar 

Javascript

<script>
  
    // JavaScript code to modify binary tree for
    // traversal using only right pointer
      
    // A binary tree node has data,
    // left child and right child
    class Node
    {
        constructor(data) {
           this.left = null;
           this.right = null;
           this.data = data;
        }
    }
  
    // function that allocates a new node
    // with the given data and null left
    // and right pointers.
    function newNode(data)
    {
        let node = new Node(data);
        return (node);
    }
  
    // Function to modify tree
    function modifytree(root)
    {
        let right = root.right;
        let rightMost = root;
  
        // if the left tree exists
        if (root.left != null)
        {
  
            // get the right-most of the
            // original left subtree
            rightMost = modifytree(root.left);
  
            // set root right to left subtree
            root.right = root.left;
            root.left = null;
        }
  
        // if the right subtree does
        // not exists we are done!
        if (right == null)
            return rightMost;
  
        // set right pointer of right-most
        // of the original left subtree
        rightMost.right = right;
  
        // modify the rightsubtree
        rightMost = modifytree(right);
        return rightMost;
    }
  
    // printing using right pointer only
    function printpre(root)
    {
        while (root != null)
        {
            document.write( root.data + " ");
            root = root.right;
        }
    }
      
    /* Constructed binary tree is
        10
        / \
        8 2
        / \
        3 5 */
    let root = newNode(10);
    root.left = newNode(8);
    root.right = newNode(2);
    root.left.left = newNode(3);
    root.left.right = newNode(5);
   
    modifytree(root);
    printpre(root);
      
</script>

C++

// C++ code to modify binary tree for
// traversal using only right pointer
#include <iostream>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
  
using namespace std;
  
// A binary tree node has data,
// left child and right child
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};
  
// Helper function that allocates a new
// node with the given data and NULL
// left and right  pointers.
struct Node* newNode(int data)
{
    struct Node* node = new struct Node;
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return (node);
}
  
// An iterative process to set the right
// pointer of Binary tree
void modifytree(struct Node* root)
{
    // Base Case
    if (root == NULL)
        return;
  
    // Create an empty stack and push root to it
    stack<Node*> nodeStack;
    nodeStack.push(root);
  
    /* Pop all items one by one. 
        Do following for every popped item
       a) print it
       b) push its right child
       c) push its left child
    Note that right child is pushed first
    so that left is processed first */
    struct Node* pre = NULL;
    while (nodeStack.empty() == false) {
  
        // Pop the top item from stack
        struct Node* node = nodeStack.top();
  
        nodeStack.pop();
  
        // Push right and left children of
        // the popped node to stack
        if (node->right)
            nodeStack.push(node->right);
        if (node->left)
            nodeStack.push(node->left);
  
        // check if some previous node exists
        if (pre != NULL) {
  
            // set the right pointer of
            // previous node to current
            pre->right = node;
        }
  
        // set previous node as current node
        pre = node;
    }
}
  
// printing using right pointer only
void printpre(struct Node* root)
{
    while (root != NULL) {
        cout << root->data << " ";
        root = root->right;
    }
}
  
// Driver code
int main()
{
    /* Constructed binary tree is
            10
          /   \
        8      2
      /  \    
    3     5  
  */
    struct Node* root = newNode(10);
    root->left = newNode(8);
    root->right = newNode(2);
    root->left->left = newNode(3);
    root->left->right = newNode(5);
  
    modifytree(root);
    printpre(root);
  
    return 0;
}

Java

// Java code to modify binary tree for 
// traversal using only right pointer 
import java.util.*;
class GfG {
  
// A binary tree node has data, 
// left child and right child 
static class Node { 
    int data; 
    Node left; 
    Node right; 
}
  
// Helper function that allocates a new 
// node with the given data and NULL 
// left and right pointers. 
static Node newNode(int data) 
{ 
    Node node = new Node(); 
    node.data = data; 
    node.left = null; 
    node.right = null; 
    return (node); 
} 
  
// An iterative process to set the right 
// pointer of Binary tree 
static void modifytree(Node root) 
{ 
    // Base Case 
    if (root == null) 
        return; 
  
    // Create an empty stack and push root to it 
    Stack<Node> nodeStack = new Stack<Node> (); 
    nodeStack.push(root); 
  
    /* Pop all items one by one. 
        Do following for every popped item 
    a) print it 
    b) push its right child 
    c) push its left child 
    Note that right child is pushed first 
    so that left is processed first */
    Node pre = null; 
    while (nodeStack.isEmpty() == false) { 
  
        // Pop the top item from stack 
        Node node = nodeStack.peek(); 
  
        nodeStack.pop(); 
  
        // Push right and left children of 
        // the popped node to stack 
        if (node.right != null) 
            nodeStack.push(node.right); 
        if (node.left != null) 
            nodeStack.push(node.left); 
  
        // check if some previous node exists 
        if (pre != null) { 
  
            // set the right pointer of 
            // previous node to current 
            pre.right = node; 
        } 
  
        // set previous node as current node 
        pre = node; 
    } 
} 
  
// printing using right pointer only 
static void printpre(Node root) 
{ 
    while (root != null) { 
        System.out.print(root.data + " "); 
        root = root.right; 
    } 
} 
  
// Driver code 
public static void main(String[] args) 
{ 
    /* Constructed binary tree is 
            10 
        / \ 
        8     2 
    / \     
    3     5 
*/
    Node root = newNode(10); 
    root.left = newNode(8); 
    root.right = newNode(2); 
    root.left.left = newNode(3); 
    root.left.right = newNode(5); 
  
    modifytree(root); 
    printpre(root); 
  
}
} 

Python

# Python code to modify binary tree for 
# traversal using only right pointer 
  
# A binary tree node has data, 
# left child and right child 
class newNode(): 
  
    def __init__(self, data): 
        self.data = data 
        self.left = None
        self.right = None
  
# An iterative process to set the right 
# pointer of Binary tree 
def modifytree( root):
      
    # Base Case 
    if (root == None):
        return
          
    # Create an empty stack and append root to it 
    nodeStack = []
    nodeStack.append(root) 
      
    ''' Pop all items one by one. 
    Do following for every popped item 
    a) print 
    b) append its right child 
    c) append its left child 
    Note that right child is appended first 
    so that left is processed first '''
    pre = None
    while (len(nodeStack)):
          
        # Pop the top item from stack 
        node = nodeStack[-1]
        nodeStack.pop() 
          
        # append right and left children of 
        # the popped node to stack 
        if (node.right):
            nodeStack.append(node.right)
        if (node.left):
            nodeStack.append(node.left) 
              
        # check if some previous node exists 
        if (pre != None):
              
            # set the right pointer of 
            # previous node to current 
            pre.right = node 
              
        # set previous node as current node 
        pre = node 
          
# printing using right pointer only 
def printpre( root):
    while (root != None):
        print(root.data, end = " ")
        root = root.right 
      
# Driver code 
  
''' Constructed binary tree is 
        10 
    / \ 
    8     2 
/ \     
3     5 
'''
root = newNode(10) 
root.left = newNode(8) 
root.right = newNode(2) 
root.left.left = newNode(3) 
root.left.right = newNode(5) 
  
modifytree(root) 
printpre(root) 
  
# This code is contributed by SHUBHAMSINGH10

C#

// C# code to modify binary tree for 
// traversal using only right pointer 
using System; 
using System.Collections;
  
class GfG 
{
  
// A binary tree node has data, 
// left child and right child 
public class Node 
{ 
    public int data; 
    public Node left; 
    public Node right; 
}
  
// Helper function that allocates a new 
// node with the given data and NULL 
// left and right pointers. 
static Node newNode(int data) 
{ 
    Node node = new Node(); 
    node.data = data; 
    node.left = null; 
    node.right = null; 
    return (node); 
} 
  
// An iterative process to set the right 
// pointer of Binary tree 
static void modifytree(Node root) 
{ 
    // Base Case 
    if (root == null) 
        return; 
  
    // Create an empty stack and Push root to it 
    Stack nodeStack = new Stack(); 
    nodeStack.Push(root); 
  
    /* Pop all items one by one. 
        Do following for every Popped item 
    a) print it 
    b) Push its right child 
    c) Push its left child 
    Note that right child is Pushed first 
    so that left is processed first */
    Node pre = null; 
    while (nodeStack.Count !=0) 
    { 
  
        // Pop the top item from stack 
        Node node = (Node)nodeStack.Peek(); 
  
        nodeStack.Pop(); 
  
        // Push right and left children of 
        // the Popped node to stack 
        if (node.right != null) 
            nodeStack.Push(node.right); 
        if (node.left != null) 
            nodeStack.Push(node.left); 
  
        // check if some previous node exists 
        if (pre != null) 
        { 
  
            // set the right pointer of 
            // previous node to current 
            pre.right = node; 
        } 
  
        // set previous node as current node 
        pre = node; 
    } 
} 
  
// printing using right pointer only 
static void printpre(Node root) 
{ 
    while (root != null) 
    { 
        Console.Write(root.data + " "); 
        root = root.right; 
    } 
} 
  
// Driver code 
public static void Main(String []args) 
{ 
    /* Constructed binary tree is 
            10 
        / \ 
        8     2 
    / \     
    3     5 
*/
    Node root = newNode(10); 
    root.left = newNode(8); 
    root.right = newNode(2); 
    root.left.left = newNode(3); 
    root.left.right = newNode(5); 
  
    modifytree(root); 
    printpre(root); 
}
} 
  
// This code is contributed by
// Arnab Kundu

Javascript

<script>
  
    // JavaScript code to modify binary tree for
    // traversal using only right pointer
      
    class Node
    {
        constructor(data) {
           this.left = null;
           this.right = null;
           this.data = data;
        }
    }
  
    // Helper function that allocates a new
    // node with the given data and NULL
    // left and right pointers.
    function newNode(data)
    {
        let node = new Node(data);
        return (node);
    }
  
    // An iterative process to set the right
    // pointer of Binary tree
    function modifytree(root)
    {
        // Base Case
        if (root == null)
            return;
  
        // Create an empty stack and push root to it
        let nodeStack = [];
        nodeStack.push(root);
  
        /* Pop all items one by one.
            Do following for every popped item
        a) print it
        b) push its right child
        c) push its left child
        Note that right child is pushed first
        so that left is processed first */
        let pre = null;
        while (nodeStack.length > 0) {
  
            // Pop the top item from stack
            let node = nodeStack[nodeStack.length - 1];
  
            nodeStack.pop();
  
            // Push right and left children of
            // the popped node to stack
            if (node.right != null)
                nodeStack.push(node.right);
            if (node.left != null)
                nodeStack.push(node.left);
  
            // check if some previous node exists
            if (pre != null) {
  
                // set the right pointer of
                // previous node to current
                pre.right = node;
            }
  
            // set previous node as current node
            pre = node;
        }
    }
  
    // printing using right pointer only
    function printpre(root)
    {
        while (root != null) {
            document.write(root.data + " ");
            root = root.right;
        }
    }
      
    /* Constructed binary tree is
            10
            / \
            8  2
           / \    
          3   5
    */
    let root = newNode(10);
    root.left = newNode(8);
    root.right = newNode(2);
    root.left.left = newNode(3);
    root.left.right = newNode(5);
   
    modifytree(root);
    printpre(root);
  
</script>

Publicación traducida automáticamente

Artículo escrito por aditya314 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 *