Представление двоичного дерева слева направо является стандартным представлением, где каждый узел имеет указатель на левого потомка и другой указатель на правый потомок.
Представление «вниз-вправо» — это альтернативное представление, в котором каждый узел имеет указатель на левого (или первого) дочернего элемента и другой указатель на следующего родного элемента. Таким образом, братья и сестры на каждом уровне связаны слева направо.
Дано двоичное дерево в лево-правом представлении, как показано ниже
1
/ \
2 3
/ \
4 5
/ / \
6 7 8
Преобразуйте структуру дерева в нисходящее представление, как показано ниже.
1
|
2 – 3
|
4 — 5
| |
6 7 – 8
Преобразование должно происходить на месте, то есть левый дочерний указатель должен использоваться как указатель вниз, а правый дочерний указатель должен использоваться как указатель правого брата.
Мы настоятельно рекомендуем свернуть ваш браузер и попробовать это самостоятельно.
Идея состоит в том, чтобы сначала преобразовать левого и правого потомка, а затем преобразовать корень. Ниже приводится реализация идеи на С ++.
C ++
#include <iostream> #include <queue>
using namespace std;
struct node
{
int key;
struct node *left, *right;
};
void convert(node *root)
{
if (root == NULL) return ;
convert(root->left);
convert(root->right);
if (root->left == NULL)
root->left = root->right;
else
root->left->right = root->right;
root->right = NULL;
}
void downRightTraversal(node *root)
{
if (root != NULL)
{
cout << root->key << " " ;
downRightTraversal(root->right);
downRightTraversal(root->left);
}
}
node* newNode( int key)
{
node *temp = new node;
temp->key = key;
temp->left = temp->right = NULL;
return temp;
}
int main()
{
node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->right->left = newNode(4);
root->right->right = newNode(5);
root->right->left->left = newNode(6);
root->right->right->left = newNode(7);
root->right->right->right = newNode(8);
convert(root);
cout << "Traversal of the tree converted to down-right form\n" ;
downRightTraversal(root);
return 0;
}
|
Джава
class GFG
{
static class node
{
int key;
node left, right;
node( int key)
{
this .key = key;
this .left = null ;
this .right = null ;
}
}
static void convert(node root)
{
if (root == null ) return ;
convert(root.left);
convert(root.right);
if (root.left == null )
root.left = root.right;
else
root.left.right = root.right;
root.right = null ;
}
static void downRightTraversal(node root)
{
if (root != null )
{
System.out.print(root.key + " " );
downRightTraversal(root.right);
downRightTraversal(root.left);
}
}
static node newNode( int key)
{
node temp = new node( 0 );
temp.key = key;
temp.left = null ;
temp.right = null ;
return temp;
}
public static void main(String[] args)
{
node root = new node( 1 );
root.left = newNode( 2 );
root.right = newNode( 3 );
root.right.left = newNode( 4 );
root.right.right = newNode( 5 );
root.right.left.left = newNode( 6 );
root.right.right.left = newNode( 7 );
root.right.right.right = newNode( 8 );
convert(root);
System.out.println( "Traversal of the tree " +
"converted to down-right form" );
downRightTraversal(root);
} }
|
python3
class newNode:
def __init__( self , key):
self .key = key
self .left = None
self .right = None
def convert(root):
if (root = = None ):
return
convert(root.left)
convert(root.right)
if (root.left = = None ):
root.left = root.right
else :
root.left.right = root.right
root.right = None
def downRightTraversal(root):
if (root ! = None ):
print ( root.key, end = " " )
downRightTraversal(root.right)
downRightTraversal(root.left)
if __name__ = = '__main__' :
root = newNode( 1 )
root.left = newNode( 2 )
root.right = newNode( 3 )
root.right.left = newNode( 4 )
root.right.right = newNode( 5 )
root.right.left.left = newNode( 6 )
root.right.right.left = newNode( 7 )
root.right.right.right = newNode( 8 )
convert(root)
print ( "Traversal of the tree converted" ,
"to down-right form" )
downRightTraversal(root)
|
C #
using System;
class GFG
{
public class node
{
public int key;
public node left, right;
public node( int key)
{
this .key = key;
this .left = null ;
this .right = null ;
}
}
public static void convert(node root)
{
if (root == null )
{
return ;
}
convert(root.left);
convert(root.right);
if (root.left == null )
{
root.left = root.right;
}
else
{
root.left.right = root.right;
}
root.right = null ;
}
public static void downRightTraversal(node root)
{
if (root != null )
{
Console.Write(root.key + " " );
downRightTraversal(root.right);
downRightTraversal(root.left);
}
}
public static node newNode( int key)
{
node temp = new node(0);
temp.key = key;
temp.left = null ;
temp.right = null ;
return temp;
}
public static void Main( string [] args)
{
node root = new node(1);
root.left = newNode(2);
root.right = newNode(3);
root.right.left = newNode(4);
root.right.right = newNode(5);
root.right.left.left = newNode(6);
root.right.right.left = newNode(7);
root.right.right.right = newNode(8);
convert(root);
Console.WriteLine( "Traversal of the tree " +
"converted to down-right form" );
downRightTraversal(root);
} }
|
Выход:
Traversal of the tree converted to down-right form
1 2 3 4 5 7 8 6
Временная сложность вышеуказанной программы составляет O (n).
Эта статья предоставлена Abhishek . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
Преобразовать лево-правое представление двоичного дерева в нисходящее
0.00 (0%) 0 votes