根据给定的前序遍历构造一棵特殊树

给定一个数组“pre[]”,该数组表示一个特殊二叉树的前序遍历,其中每个节点都有0或2个子节点。又给出了一个数组’preLN[],它只有两个可能的值’L’和’N’。“preLN[]”中的值“L”表示二叉树中的对应节点是叶节点,“N”表示对应节点是非叶节点。编写一个函数,从给定的两个数组构造树。

null

例子:

Input:  pre[] = {10, 30, 20, 5, 15},  preLN[] = {'N', 'N', 'L', 'L', 'L'}Output: Root of following tree          10         /          30   15       /        20   5

pre[]中的第一个元素始终是root。所以我们可以很容易地找出根源。如果左子树为空,则右子树也必须为空,并且root的preLN[]项必须为“L”。我们可以简单地创建一个节点并返回它。如果左、右子树不为空,则递归调用左、右子树,并将返回的节点链接到根节点。

C++

/* A program to construct Binary Tree from preorder traversal */
#include<bits/stdc++.h>
/* A binary tree node structure */
struct node
{
int data;
struct node *left;
struct node *right;
};
/* Utility function to create a new Binary Tree node */
struct node* newNode ( int data)
{
struct node *temp = new struct node;
temp->data = data;
temp->left = NULL;
temp->right = NULL;
return temp;
}
/* A recursive function to create a Binary Tree from given pre[]
preLN[] arrays. The function returns root of tree. index_ptr is used
to update index values in recursive calls. index must be initially
passed as 0 */
struct node *constructTreeUtil( int pre[], char preLN[], int *index_ptr, int n)
{
int index = *index_ptr; // store the current value of index in pre[]
// Base Case: All nodes are constructed
if (index == n)
return NULL;
// Allocate memory for this node and increment index for
// subsequent recursive calls
struct node *temp = newNode ( pre[index] );
(*index_ptr)++;
// If this is an internal node, construct left and right subtrees and link the subtrees
if (preLN[index] == 'N' )
{
temp->left  = constructTreeUtil(pre, preLN, index_ptr, n);
temp->right = constructTreeUtil(pre, preLN, index_ptr, n);
}
return temp;
}
// A wrapper over constructTreeUtil()
struct node *constructTree( int pre[], char preLN[], int n)
{
// Initialize index as 0. Value of index is used in recursion to maintain
// the current index in pre[] and preLN[] arrays.
int index = 0;
return constructTreeUtil (pre, preLN, &index, n);
}
/* This function is used only for testing */
void printInorder ( struct node* node)
{
if (node == NULL)
return ;
/* first recur on left child */
printInorder (node->left);
/* then print the data of node */
printf ( "%d " , node->data);
/* now recur on right child */
printInorder (node->right);
}
/* Driver function to test above functions */
int main()
{
struct node *root = NULL;
/* Constructing tree given in the above figure
10
/
30   15
/
20   5 */
int pre[] = {10, 30, 20, 5, 15};
char preLN[] = { 'N' , 'N' , 'L' , 'L' , 'L' };
int n = sizeof (pre)/ sizeof (pre[0]);
// construct the above tree
root = constructTree (pre, preLN, n);
// Test the constructed tree
printf ( "Following is Inorder Traversal of the Constructed Binary Tree: " );
printInorder (root);
return 0;
}


JAVA

// Java program to construct a binary tree from preorder traversal
// A Binary Tree node
class Node
{
int data;
Node left, right;
Node( int item)
{
data = item;
left = right = null ;
}
}
class Index
{
int index = 0 ;
}
class BinaryTree
{
Node root;
Index myindex = new Index();
/* A recursive function to create a Binary Tree from given pre[]
preLN[] arrays. The function returns root of tree. index_ptr is used
to update index values in recursive calls. index must be initially
passed as 0 */
Node constructTreeUtil( int pre[], char preLN[], Index index_ptr,
int n, Node temp)
{
// store the current value of index in pre[]
int index = index_ptr.index;
// Base Case: All nodes are constructed
if (index == n)
return null ;
// Allocate memory for this node and increment index for
// subsequent recursive calls
temp = new Node(pre[index]);
(index_ptr.index)++;
// If this is an internal node, construct left and right subtrees
// and link the subtrees
if (preLN[index] == 'N' )
{
temp.left = constructTreeUtil(pre, preLN, index_ptr, n,
temp.left);
temp.right = constructTreeUtil(pre, preLN, index_ptr, n,
temp.right);
}
return temp;
}
// A wrapper over constructTreeUtil()
Node constructTree( int pre[], char preLN[], int n, Node node)
{
// Initialize index as 0. Value of index is used in recursion to
// maintain the current index in pre[] and preLN[] arrays.
int index = 0 ;
return constructTreeUtil(pre, preLN, myindex, n, node);
}
/* This function is used only for testing */
void printInorder(Node node)
{
if (node == null )
return ;
/* first recur on left child */
printInorder(node.left);
/* then print the data of node */
System.out.print(node.data + " " );
/* now recur on right child */
printInorder(node.right);
}
// driver function to test the above functions
public static void main(String args[])
{
BinaryTree tree = new BinaryTree();
int pre[] = new int []{ 10 , 30 , 20 , 5 , 15 };
char preLN[] = new char []{ 'N' , 'N' , 'L' , 'L' , 'L' };
int n = pre.length;
// construct the above tree
Node mynode = tree.constructTree(pre, preLN, n, tree.root);
// Test the constructed tree
System.out.println( "Following is Inorder Traversal of the"
+ "Constructed Binary Tree: " );
tree.printInorder(mynode);
}
}
// This code has been contributed by Mayank Jaiswal


Python3

# A program to construct Binary
# Tree from preorder traversal
# Utility function to create a
# new Binary Tree node
class newNode:
def __init__( self , data):
self .data = data
self .left = None
self .right = None
# A recursive function to create a
# Binary Tree from given pre[] preLN[]
# arrays. The function returns root of
# tree. index_ptr is used to update
# index values in recursive calls. index
# must be initially passed as 0
def constructTreeUtil(pre, preLN, index_ptr, n):
index = index_ptr[ 0 ] # store the current value
# of index in pre[]
# Base Case: All nodes are constructed
if index = = n:
return None
# Allocate memory for this node and
# increment index for subsequent
# recursive calls
temp = newNode(pre[index])
index_ptr[ 0 ] + = 1
# If this is an internal node, construct left
# and right subtrees and link the subtrees
if preLN[index] = = 'N' :
temp.left = constructTreeUtil(pre, preLN,
index_ptr, n)
temp.right = constructTreeUtil(pre, preLN,
index_ptr, n)
return temp
# A wrapper over constructTreeUtil()
def constructTree(pre, preLN, n):
# Initialize index as 0. Value of index is
# used in recursion to maintain the current
# index in pre[] and preLN[] arrays.
index = [ 0 ]
return constructTreeUtil(pre, preLN, index, n)
# This function is used only for testing
def printInorder (node):
if node = = None :
return
# first recur on left child
printInorder (node.left)
# then print the data of node
print (node.data,end = " " )
# now recur on right child
printInorder (node.right)
# Driver Code
if __name__ = = '__main__' :
root = None
# Constructing tree given in
# the above figure
#     10
#     /
# 30 15
# /
# 20 5
pre = [ 10 , 30 , 20 , 5 , 15 ]
preLN = [ 'N' , 'N' , 'L' , 'L' , 'L' ]
n = len (pre)
# construct the above tree
root = constructTree (pre, preLN, n)
# Test the constructed tree
print ( "Following is Inorder Traversal of" ,
"the Constructed Binary Tree:" )
printInorder (root)
# This code is contributed by PranchalK


C#

// C# program to construct a binary
// tree from preorder traversal
using System;
// A Binary Tree node
public class Node
{
public int data;
public Node left, right;
public Node( int item)
{
data = item;
left = right = null ;
}
}
public class Index
{
public int index = 0;
}
class GFG
{
public Node root;
public Index myindex = new Index();
/* A recursive function to create a
Binary Tree from given pre[] preLN[] arrays.
The function returns root of tree. index_ptr
is used to update index values in recursive
calls. index must be initially passed as 0 */
public virtual Node constructTreeUtil( int [] pre, char [] preLN,
Index index_ptr, int n,
Node temp)
{
// store the current value of index in pre[]
int index = index_ptr.index;
// Base Case: All nodes are constructed
if (index == n)
{
return null ;
}
// Allocate memory for this node
// and increment index for
// subsequent recursive calls
temp = new Node(pre[index]);
(index_ptr.index)++;
// If this is an internal node,
// construct left and right subtrees
// and link the subtrees
if (preLN[index] == 'N' )
{
temp.left = constructTreeUtil(pre, preLN, index_ptr,
n, temp.left);
temp.right = constructTreeUtil(pre, preLN, index_ptr,
n, temp.right);
}
return temp;
}
// A wrapper over constructTreeUtil()
public virtual Node constructTree( int [] pre, char [] preLN,
int n, Node node)
{
// Initialize index as 0. Value of
// index is used in recursion to
// maintain the current index in
// pre[] and preLN[] arrays.
int index = 0;
return constructTreeUtil(pre, preLN,
myindex, n, node);
}
/* This function is used only for testing */
public virtual void printInorder(Node node)
{
if (node == null )
{
return ;
}
/* first recur on left child */
printInorder(node.left);
/* then print the data of node */
Console.Write(node.data + " " );
/* now recur on right child */
printInorder(node.right);
}
// Driver Code
public static void Main( string [] args)
{
GFG tree = new GFG();
int [] pre = new int []{10, 30, 20, 5, 15};
char [] preLN = new char []{ 'N' , 'N' , 'L' , 'L' , 'L' };
int n = pre.Length;
// construct the above tree
Node mynode = tree.constructTree(pre, preLN,
n, tree.root);
// Test the constructed tree
Console.WriteLine( "Following is Inorder Traversal of the" +
"Constructed Binary Tree: " );
tree.printInorder(mynode);
}
}
// This code is contributed by Shrikant13


Javascript

<script>
// JavaScript program to construct a binary
// tree from preorder traversal
// A Binary Tree node
class Node
{
constructor(item)
{
this .data = item;
this .left = null ;
this .right = null ;
}
}
class Index
{
constructor()
{
this .index = 0;
}
}
var root = null ;
var myindex = new Index();
/* A recursive function to create a
Binary Tree from given pre[] preLN[] arrays.
The function returns root of tree. index_ptr
is used to update index values in recursive
calls. index must be initially passed as 0 */
function constructTreeUtil(pre, preLN, index_ptr, n, temp)
{
// store the current value of index in pre[]
var index = index_ptr.index;
// Base Case: All nodes are constructed
if (index == n)
{
return null ;
}
// Allocate memory for this node
// and increment index for
// subsequent recursive calls
temp = new Node(pre[index]);
(index_ptr.index)++;
// If this is an internal node,
// construct left and right subtrees
// and link the subtrees
if (preLN[index] == 'N' )
{
temp.left = constructTreeUtil(pre, preLN, index_ptr,
n, temp.left);
temp.right = constructTreeUtil(pre, preLN, index_ptr,
n, temp.right);
}
return temp;
}
// A wrapper over constructTreeUtil()
function constructTree(pre, preLN, n, node)
{
// Initialize index as 0. Value of
// index is used in recursion to
// maintain the current index in
// pre[] and preLN[] arrays.
var index = 0;
return constructTreeUtil(pre, preLN,
myindex, n, node);
}
/* This function is used only for testing */
function printInorder( node)
{
if (node == null )
{
return ;
}
/* first recur on left child */
printInorder(node.left);
/* then print the data of node */
document.write(node.data + " " );
/* now recur on right child */
printInorder(node.right);
}
// Driver Code
var pre = [10, 30, 20, 5, 15];
var preLN = [ 'N' , 'N' , 'L' , 'L' , 'L' ];
var n = pre.length;
// construct the above tree
var mynode = constructTree(pre, preLN,
n, root);
// Test the constructed tree
document.write( "Following is Inorder Traversal of the" +
"Constructed Binary Tree:<br>" );
printInorder(mynode);
</script>


输出:

Following is Inorder Traversal of the Constructed Binary Tree:20 30 5 10 15

时间复杂性: O(n) 从其前序遍历构造完整的k叉树 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论

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