二叉树的简洁编码

二叉树的简洁编码占用的空间接近最小。n个节点上结构不同的二叉树的数量为 加泰罗尼亚数字 .对于大n,这大约是4 N ; 因此,我们至少需要一个日志 2. 4. N =2n位进行编码。因此,简洁的二叉树将占用2n+o(n)位。

null

满足这一界限的一个简单表示是按预先顺序访问树的节点,对内部节点输出“1”,对叶子输出“0”。如果树包含数据,我们可以简单地同时将其按顺序存储在一个连续的数组中。

以下是编码算法:

function EncodeSuccinct(node n, bitstring structure, array data) {    if n = nil then        append 0 to structure;    else        append 1 to structure;        append n.data to data;        EncodeSuccinct(n.left, structure, data);        EncodeSuccinct(n.right, structure, data);}

下面是解码算法

function DecodeSuccinct(bitstring structure, array data) {    remove first bit of structure and put it in b    if b = 1 then        create a new node n        remove first element of data and put it in n.data        n.left = DecodeSuccinct(structure, data)        n.right = DecodeSuccinct(structure, data)        return n    else        return nil}

资料来源: https://en.wikipedia.org/wiki/Binary_tree#Succinct_encodings 例子:

Input:           10     /         20       30  /           40   50      70 Data Array (Contains preorder traversal)10 20 40 50 30 70Structure Array1 1 1 0 0 1 0 0 1 0 1 0 0 1 indicates data and 0 indicates NULL

下面是上述算法的实现。

C++

// C++ program to demonstrate Succinct Tree Encoding and decoding
#include<bits/stdc++.h>
using namespace std;
// A Binary Tree Node
struct Node
{
int key;
struct Node* left, *right;
};
// Utility function to create new Node
Node *newNode( int key)
{
Node *temp = new Node;
temp->key  = key;
temp->left  = temp->right = NULL;
return (temp);
}
// This function fills lists 'struc' and 'data'.  'struc' list
// stores structure information. 'data' list stores tree data
void EncodeSuccinct(Node *root, list< bool > &struc, list< int > &data)
{
// If root is NULL, put 0 in structure array and return
if (root == NULL)
{
struc.push_back(0);
return ;
}
// Else place 1 in structure array, key in 'data' array
// and recur for left and right children
struc.push_back(1);
data.push_back(root->key);
EncodeSuccinct(root->left, struc, data);
EncodeSuccinct(root->right, struc, data);
}
// Constructs tree from 'struc' and 'data'
Node *DecodeSuccinct(list< bool > &struc, list< int > &data)
{
if (struc.size() <= 0)
return NULL;
// Remove one item from structure list
bool b = struc.front();
struc.pop_front();
// If removed bit is 1,
if (b == 1)
{
// remove an item from data list
int key = data.front();
data.pop_front();
// Create a tree node with the removed data
Node *root = newNode(key);
// And recur to create left and right subtrees
root->left = DecodeSuccinct(struc, data);
root->right = DecodeSuccinct(struc, data);
return root;
}
return NULL;
}
// A utility function to print tree
void preorder(Node* root)
{
if (root)
{
cout << "key: " << root->key;
if (root->left)
cout << " | left child: " << root->left->key;
if (root->right)
cout << " | right child: " << root->right->key;
cout << endl;
preorder(root->left);
preorder(root->right);
}
}
// Driver program
int main()
{
// Let us construct the Tree shown in the above figure
Node *root         = newNode(10);
root->left         = newNode(20);
root->right        = newNode(30);
root->left->left   = newNode(40);
root->left->right  = newNode(50);
root->right->right = newNode(70);
cout << "Given Tree" ;
preorder(root);
list< bool > struc;
list< int >  data;
EncodeSuccinct(root, struc, data);
cout << "Encoded Tree" ;
cout << "Structure List" ;
list< bool >::iterator si; // Structure iterator
for (si = struc.begin(); si != struc.end(); ++si)
cout << *si << " " ;
cout << "Data List" ;
list< int >::iterator di; // Data iIterator
for (di = data.begin(); di != data.end(); ++di)
cout << *di << " " ;
Node *newroot = DecodeSuccinct(struc, data);
cout << "Preorder traversal of decoded tree" ;
preorder(newroot);
return 0;
}


JAVA

// Java program to demonstrate Succinct
// Tree Encoding and decoding
import java.util.*;
class GFG{
// A Binary Tree Node
static class Node
{
int key;
Node left, right;
};
// Utility function to create new Node
static Node newNode( int key)
{
Node temp = new Node();
temp.key  = key;
temp.left  = temp.right = null ;
return (temp);
}
static Vector<Boolean> struc;
static Vector<Integer> data;
static Node root;
// This function fills lists 'struc' and
// 'data'. 'struc' list stores structure
// information. 'data' list stores tree data
static void EncodeSuccinct(Node root)
{
// If root is null, put 0 in
// structure array and return
if (root == null )
{
struc.add( false );
return ;
}
// Else place 1 in structure array,
// key in 'data' array and recur
// for left and right children
struc.add( true );
data.add(root.key);
EncodeSuccinct(root.left);
EncodeSuccinct(root.right);
}
// Constructs tree from 'struc' and 'data'
static Node DecodeSuccinct()
{
if (struc.size() <= 0 )
return null ;
// Remove one item from structure list
boolean b = struc.get( 0 );
struc.remove( 0 );
// If removed bit is 1,
if (b == true )
{
// Remove an item from data list
int key = data.get( 0 );
data.remove( 0 );
// Create a tree node with the
// removed data
Node root = newNode(key);
// And recur to create left and
// right subtrees
root.left = DecodeSuccinct();
root.right = DecodeSuccinct();
return root;
}
return null ;
}
// A utility function to print tree
static void preorder(Node root)
{
if (root != null )
{
System.out.print( "key: " + root.key);
if (root.left != null )
System.out.print( " | left child: " +
root.left.key);
if (root.right != null )
System.out.print( " | right child: " +
root.right.key);
System.out.println();
preorder(root.left);
preorder(root.right);
}
}
// Driver code
public static void main(String[] args)
{
// Let us construct Tree shown in
// the above figure
Node root = newNode( 10 );
root.left = newNode( 20 );
root.right = newNode( 30 );
root.left.left = newNode( 40 );
root.left.right = newNode( 50 );
root.right.right = newNode( 70 );
System.out.print( "Given Tree" );
preorder(root);
struc = new Vector<>();
data = new Vector<>();
EncodeSuccinct(root);
System.out.print( "Encoded Tree" );
System.out.print( "Structure List" );
for ( boolean si : struc)
{
if (si == true )
System.out.print( 1 + " " );
else
System.out.print( 0 + " " );
}
System.out.print( "Data List" );
for ( int di : data)
System.out.print(di + " " );
Node newroot = DecodeSuccinct();
System.out.print( "Preorder traversal" +
"of decoded tree" );
preorder(newroot);
}
}
// This code is contributed by aashish1995


Python3

# Python program to demonstrate Succinct Tree Encoding and Decoding
# Node structure
class Node:
# Utility function to create new Node
def __init__( self , key):
self .key = key
self .left = None
self .right = None
def EncodeSuccinct(root , struc , data):
# If root is None , put 0 in structure array and return
if root is None :
struc.append( 0 )
return
# Else place 1 in structure array, key in 'data' array
# and recur for left and right children
struc.append( 1 )
data.append(root.key)
EncodeSuccinct(root.left , struc , data)
EncodeSuccinct(root.right , struc ,data)
# Constructs tree from 'struc' and 'data'
def DecodeSuccinct(struc , data):
if ( len (struc) < = 0 ):
return None
# Remove one item from structure list
b = struc[ 0 ]
struc.pop( 0 )
# If removed bit is 1
if b = = 1 :
key = data[ 0 ]
data.pop( 0 )
#Create a tree node with removed data
root = Node(key)
#And recur to create left and right subtrees
root.left = DecodeSuccinct(struc , data);
root.right = DecodeSuccinct(struc , data);
return root
return None
def preorder(root):
if root is not None :
print ( "key: %d" % (root.key),end = " " )
if root.left is not None :
print ( "| left child: %d" % (root.left.key),end = " " )
if root.right is not None :
print ( "| right child %d" % (root.right.key),end = " " )
print ()
preorder(root.left)
preorder(root.right)
# Driver Program
root = Node( 10 )
root.left = Node( 20 )
root.right = Node( 30 )
root.left.left = Node( 40 )
root.left.right = Node( 50 )
root.right.right = Node( 70 )
print ( "Given Tree" )
preorder(root)
struc = []
data = []
EncodeSuccinct(root , struc , data)
print ( "Encoded Tree" )
print ( "Structure List" )
for i in struc:
print (i ,end = " " )
print ( "DataList" )
for value in data:
print (value,end = " " )
newroot = DecodeSuccinct(struc , data)
print ( "Preorder Traversal of decoded tree" )
preorder(newroot)
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)


C#

// C# program to demonstrate Succinct
// Tree Encoding and decoding
using System;
using System.Collections.Generic;
class GFG{
// A Binary Tree Node
public
class Node
{
public
int key;
public
Node left, right;
};
// Utility function to create new Node
static Node newNode( int key)
{
Node temp = new Node();
temp.key  = key;
temp.left  = temp.right = null ;
return (temp);
}
static List<Boolean> struc;
static List< int > data;
static Node root;
// This function fills lists 'struc' and
// 'data'. 'struc' list stores structure
// information. 'data' list stores tree data
static void EncodeSuccinct(Node root)
{
// If root is null, put 0 in
// structure array and return
if (root == null )
{
struc.Add( false );
return ;
}
// Else place 1 in structure array,
// key in 'data' array and recur
// for left and right children
struc.Add( true );
data.Add(root.key);
EncodeSuccinct(root.left);
EncodeSuccinct(root.right);
}
// Constructs tree from 'struc' and 'data'
static Node DecodeSuccinct()
{
if (struc.Count <= 0)
return null ;
// Remove one item from structure list
bool b = struc[0];
struc.RemoveAt(0);
// If removed bit is 1,
if (b == true )
{
// Remove an item from data list
int key = data[0];
data.Remove(0);
// Create a tree node with the
// removed data
Node root = newNode(key);
// And recur to create left and
// right subtrees
root.left = DecodeSuccinct();
root.right = DecodeSuccinct();
return root;
}
return null ;
}
// A utility function to print tree
static void preorder(Node root)
{
if (root != null )
{
Console.Write( "key: " + root.key);
if (root.left != null )
Console.Write( " | left child: " +
root.left.key);
if (root.right != null )
Console.Write( " | right child: " +
root.right.key);
Console.WriteLine();
preorder(root.left);
preorder(root.right);
}
}
// Driver code
public static void Main(String[] args)
{
// Let us construct Tree shown in
// the above figure
Node root = newNode(10);
root.left = newNode(20);
root.right = newNode(30);
root.left.left = newNode(40);
root.left.right = newNode(50);
root.right.right = newNode(70);
Console.Write( "Given Tree" );
preorder(root);
struc = new List<Boolean>();
data = new List< int >();
EncodeSuccinct(root);
Console.Write( "Encoded Tree" );
Console.Write( "Structure List" );
foreach ( bool si in struc)
{
if (si == true )
Console.Write(1 + " " );
else
Console.Write(0 + " " );
}
Console.Write( "Data List" );
foreach ( int di in data)
Console.Write(di + " " );
Node newroot = DecodeSuccinct();
Console.Write( "Preorder traversal" +
"of decoded tree" );
preorder(newroot);
}
}
// This code is contributed by gauravrajput1


Javascript

<script>
// Javascript program to demonstrate Succinct
// Tree Encoding and decoding
// A Binary Tree Node
class Node
{
constructor()
{
this .key = 0;
this .left = null ;
this .right = null ;
}
};
// Utility function to create new Node
function newNode(key)
{
var temp = new Node();
temp.key  = key;
temp.left  = temp.right = null ;
return (temp);
}
var struc = [];
var data = [];
var root = null ;
// This function fills lists 'struc' and
// 'data'. 'struc' list stores structure
// information. 'data' list stores tree data
function EncodeSuccinct(root)
{
// If root is null, put 0 in
// structure array and return
if (root == null )
{
struc.push( false );
return ;
}
// Else place 1 in structure array,
// key in 'data' array and recur
// for left and right children
struc.push( true );
data.push(root.key);
EncodeSuccinct(root.left);
EncodeSuccinct(root.right);
}
// Constructs tree from 'struc' and 'data'
function DecodeSuccinct()
{
if (struc.length <= 0)
return null ;
// Remove one item from structure list
var b = struc[0];
struc.shift(0);
// If removed bit is 1,
if (b == true )
{
// Remove an item from data list
var key = data[0];
data.shift();
// Create a tree node with the
// removed data
var root = newNode(key);
// And recur to create left and
// right subtrees
root.left = DecodeSuccinct();
root.right = DecodeSuccinct();
return root;
}
return null ;
}
// A utility function to print tree
function preorder(root)
{
if (root != null )
{
document.write( "key: " + root.key);
if (root.left != null )
document.write( " | left child: " +
root.left.key);
if (root.right != null )
document.write( " | right child: " +
root.right.key);
document.write( "<br>" );
preorder(root.left);
preorder(root.right);
}
}
// Driver code
// Let us construct Tree shown in
// the above figure
var root = newNode(10);
root.left = newNode(20);
root.right = newNode(30);
root.left.left = newNode(40);
root.left.right = newNode(50);
root.right.right = newNode(70);
document.write( "Given Tree<br>" );
preorder(root);
struc = [];
data = [];
EncodeSuccinct(root);
document.write( "<br>Encoded Tree<br>" );
document.write( "Structure List<br>" );
for ( var si of struc)
{
if (si == true )
document.write(1 + " " );
else
document.write(0 + " " );
}
document.write( "<br>Data List<br>" );
for ( var di of data)
document.write(di + " " );
var newroot = DecodeSuccinct();
document.write( "<br><br>Preorder traversal" +
"of decoded tree<br>" );
preorder(newroot);
// This code is contributed by rrrtnx.
</script>


输出:

Given Treekey: 10 | left child: 20 | right child: 30key: 20 | left child: 40 | right child: 50key: 40key: 50key: 30 | right child: 70key: 70Encoded TreeStructure List1 1 1 0 0 1 0 0 1 0 1 0 0 Data List10 20 40 50 30 70 Preorder traversal of decoded treekey: 10 | left child: 20 | right child: 30key: 20 | left child: 40 | right child: 50key: 40key: 50key: 30 | right child: 70key: 70

本文由 希瓦姆 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享