将给定的二叉树转换为双链表|集3

给定一个二叉树(BT),将其转换为一个双链表(DLL)。在转换后的DLL中,节点中的左指针和右指针分别用作上一个和下一个指针。DLL中的节点顺序必须与给定二叉树的顺序相同。按序遍历的第一个节点(BT中最左边的节点)必须是DLL的头节点。

null

TreeToList

针对这个问题,讨论了以下两种不同的解决方案。 将给定的二叉树转换为双链表|集1 将给定的二叉树转换为双链表|集2

在本文中,我们将讨论第三种解决方案,这似乎是最简单的解决方案。其思想是按顺序遍历二叉树。在进行有序遍历时,在变量中跟踪之前访问的节点,例如 .对于每个访问的节点,将其设置在 这个节点的前一个 . 感谢rahul、wishall和所有其他读者对上述两篇文章的有用评论。

以下是此解决方案的实现。

C++

// A C++ program for in-place conversion of Binary Tree to DLL
#include <iostream>
using namespace std;
/* A binary tree node has data, and left and right pointers */
struct node
{
int data;
node* left;
node* right;
};
// A simple recursive function to convert a given Binary tree to Doubly
// Linked List
// root --> Root of Binary Tree
// head --> Pointer to head node of created doubly linked list
void BinaryTree2DoubleLinkedList(node *root, node **head)
{
// Base case
if (root == NULL) return ;
// Initialize previously visited node as NULL. This is
// static so that the same value is accessible in all recursive
// calls
static node* prev = NULL;
// Recursively convert left subtree
BinaryTree2DoubleLinkedList(root->left, head);
// Now convert this node
if (prev == NULL)
*head = root;
else
{
root->left = prev;
prev->right = root;
}
prev = root;
// Finally convert right subtree
BinaryTree2DoubleLinkedList(root->right, head);
}
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
node* newNode( int data)
{
node* new_node = new node;
new_node->data = data;
new_node->left = new_node->right = NULL;
return (new_node);
}
/* Function to print nodes in a given doubly linked list */
void printList(node *node)
{
while (node!=NULL)
{
cout << node->data << " " ;
node = node->right;
}
}
/* Driver program to test above functions*/
int main()
{
// Let us create the tree shown in above diagram
node *root        = newNode(10);
root->left        = newNode(12);
root->right       = newNode(15);
root->left->left  = newNode(25);
root->left->right = newNode(30);
root->right->left = newNode(36);
// Convert to DLL
node *head = NULL;
BinaryTree2DoubleLinkedList(root, &head);
// Print the converted list
printList(head);
return 0;
}


JAVA

// A Java program for in-place conversion of Binary Tree to DLL
// A binary tree node has data, left pointers and right pointers
class Node
{
int data;
Node left, right;
public Node( int data)
{
this .data = data;
left = right = null ;
}
}
class BinaryTree
{
Node root;
// head --> Pointer to head node of created doubly linked list
Node head;
// Initialize previously visited node as NULL. This is
// static so that the same value is accessible in all recursive
// calls
static Node prev = null ;
// A simple recursive function to convert a given Binary tree
// to Doubly Linked List
// root --> Root of Binary Tree
void BinaryTree2DoubleLinkedList(Node root)
{
// Base case
if (root == null )
return ;
// Recursively convert left subtree
BinaryTree2DoubleLinkedList(root.left);
// Now convert this node
if (prev == null )
head = root;
else
{
root.left = prev;
prev.right = root;
}
prev = root;
// Finally convert right subtree
BinaryTree2DoubleLinkedList(root.right);
}
/* Function to print nodes in a given doubly linked list */
void printList(Node node)
{
while (node != null )
{
System.out.print(node.data + " " );
node = node.right;
}
}
// Driver program to test above functions
public static void main(String[] args)
{
// Let us create the tree as shown in above diagram
BinaryTree tree = new BinaryTree();
tree.root = new Node( 10 );
tree.root.left = new Node( 12 );
tree.root.right = new Node( 15 );
tree.root.left.left = new Node( 25 );
tree.root.left.right = new Node( 30 );
tree.root.right.left = new Node( 36 );
// convert to DLL
tree.BinaryTree2DoubleLinkedList(tree.root);
// Print the converted List
tree.printList(tree.head);
}
}
// This code has been contributed by Mayank Jaiswal(mayank_24)


Python3

# Python program for conversion of
# binary tree to doubly linked list.
class Node:
def __init__( self , val):
self .right = None
self .data = val
self .left = None
class BtoDll:
def __init__( self ):
self .head = None
self .tail = None
def convert( self , root):
# Base case
if root is None :
return
# Recursively convert left subtree
self .convert(root.left)
# Now convert this node
node = root
if self .head is None :
self .head = node
else :
self .tail.right = node
node.left = self .tail
self .tail = node
# Finally convert right subtree
self .convert(root.right)
return self .head
def BinaryTree2DoubleLinkedList(root):
'''
A simple recursive function to convert a given Binary tree
to Doubly Linked List
root --> Root of Binary Tree
'''
converter = BtoDll()
return converter.convert(root)
def print_dll(head):
'''Function to print nodes in given doubly linked list'''
while head is not None :
print (head.data, end = " " )
head = head.right
#  Driver program to test above functions
if __name__ = = "__main__" :
# Let us create the tree as
# shown in above diagram
root = Node( 10 )
root.left = Node( 12 )
root.right = Node( 15 )
root.left.left = Node( 25 )
root.left.right = Node( 30 )
root.right.left = Node( 36 )
# convert to DLL
head = BinaryTree2DoubleLinkedList(root)
# Print the converted list
print_dll(head)
# This code is contributed by codesankalp (SANKALP)


C#

// A C# program for in-place conversion
// of Binary Tree to DLL
using System;
// A binary tree node has data, left
// pointers and right pointers
public class Node
{
public int data;
public Node left, right;
public Node( int data)
{
this .data = data;
left = right = null ;
}
}
class GFG
{
public Node root;
// head --> Pointer to head node of
// created doubly linked list
public Node head;
// Initialize previously visited node
// as NULL. This is static so that the
// same value is accessible in all
// recursive calls
public static Node prev = null ;
// A simple recursive function to
// convert a given Binary tree
// to Doubly Linked List
// root --> Root of Binary Tree
public virtual void BinaryTree2DoubleLinkedList(Node root)
{
// Base case
if (root == null )
{
return ;
}
// Recursively convert left subtree
BinaryTree2DoubleLinkedList(root.left);
// Now convert this node
if (prev == null )
{
head = root;
}
else
{
root.left = prev;
prev.right = root;
}
prev = root;
// Finally convert right subtree
BinaryTree2DoubleLinkedList(root.right);
}
/* Function to print nodes in a
given doubly linked list */
public virtual void printList(Node node)
{
while (node != null )
{
Console.Write(node.data + " " );
node = node.right;
}
}
// Driver Code
public static void Main( string [] args)
{
// Let us create the tree as
// shown in above diagram
GFG tree = new GFG();
tree.root = new Node(10);
tree.root.left = new Node(12);
tree.root.right = new Node(15);
tree.root.left.left = new Node(25);
tree.root.left.right = new Node(30);
tree.root.right.left = new Node(36);
// convert to DLL
tree.BinaryTree2DoubleLinkedList(tree.root);
// Print the converted List
tree.printList(tree.head);
}
}
// This code is contributed by Shrikant13


Javascript

<script>
// A javascript program for in-place conversion of Binary Tree to DLL
// A binary tree node has data, left pointers and right pointers
class Node {
constructor(val) {
this .data = val;
this .left = null ;
this .right = null ;
}
}
var root;
// head --> Pointer to head node of created doubly linked list
var head;
// Initialize previously visited node as NULL. This is
//  so that the same value is accessible in all recursive
// calls
var prev = null ;
// A simple recursive function to convert a given Binary tree
// to Doubly Linked List
// root --> Root of Binary Tree
function BinaryTree2DoubleLinkedList(root)
{
// Base case
if (root == null )
return ;
// Recursively convert left subtree
BinaryTree2DoubleLinkedList(root.left);
// Now convert this node
if (prev == null )
head = root;
else
{
root.left = prev;
prev.right = root;
}
prev = root;
// Finally convert right subtree
BinaryTree2DoubleLinkedList(root.right);
}
/* Function to print nodes in a given doubly linked list */
function printList(node)
{
while (node != null )
{
document.write(node.data + " " );
node = node.right;
}
}
// Driver program to test above functions
// Let us create the tree as shown in above diagram
root = new Node(10);
root.left = new Node(12);
root.right = new Node(15);
root.left.left = new Node(25);
root.left.right = new Node(30);
root.right.left = new Node(36);
// convert to DLL
BinaryTree2DoubleLinkedList(root);
// Print the converted List
printList(head);
// This code contributed by umadevi9616
</script>


输出:

25 12 30 10 36 15

请注意,使用上述静态变量不是推荐的做法(为了简单起见,我们使用了静态变量)。想象一种情况,两棵或更多的树调用相同的函数。旧价值观 将在下一次调用另一棵树时使用。为了避免此类问题,我们可以使用双指针或对指针的引用。 时间复杂性: 上面的程序执行简单的顺序遍历,因此时间复杂度为O(n),其中n是给定二叉树中的节点数。

下面的代码是上述顺序遍历方法的直观迭代实现(灵感来自 这段视频 ) –

C++

Node * bToDLL(Node *root)
{
stack<pair<Node*, int >> s;
s.push({root, 0});
vector< int > res;
bool flag = true ;
Node* head = NULL;
Node* prev = NULL;
while (!s.empty()) {
auto x = s.top();
Node* t = x.first;
int state = x.second;
s.pop();
if (state == 3 or t == NULL) continue ;
s.push({t, state+1});
if (state == 0) s.push({t->left, 0});
else if (state == 1) {
if (prev) prev->right = t;
t->left = prev;
prev = t;
if (flag) {
head = t;
flag = false ;
}
}
else if (state == 2) s.push({t->right, 0});
}
return head;
}


时间复杂度:O(N)

空间复杂性:O(N)

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

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