博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[geeksforgeeks] Convert a given Binary Tree to Doubly Linked List
阅读量:6922 次
发布时间:2019-06-27

本文共 4161 字,大约阅读时间需要 13 分钟。

 

Given a Binary Tree (Bt), convert it to a Doubly Linked List(DLL). The left and right pointers in nodes are to be used as previous and next pointers respectively in converted DLL. The order of nodes in DLL must be same as Inorder of the given Binary Tree. The first node of Inorder traversal (left most node in BT) must be head node of the DLL.

I came across this interview during one of my interviews. A similar problem is discussed in . The problem here is simpler as we don’t need to create circular DLL, but a simple DLL. The idea behind its solution is quite simple and straight.

1. If left subtree exists, process the left subtree

…..1.a) Recursively convert the left subtree to DLL.
…..1.b) Then find inorder predecessor of root in left subtree (inorder predecessor is rightmost node in left subtree).
…..1.c) Make inorder predecessor as previous of root and root as next of inorder predecessor.
2. If right subtree exists, process the right subtree (Below 3 steps are similar to left subtree).
…..2.a) Recursively convert the right subtree to DLL.
…..2.b) Then find inorder successor of root in right subtree (inorder successor is leftmost node in right subtree).
…..2.c) Make inorder successor as next of root and root as previous of inorder successor.
3. Find the leftmost node and return it (the leftmost node is always head of converted DLL).

Below is the source code for above algorithm.

 

// A C++ program for in-place conversion of Binary Tree to DLL#include 
/* A binary tree node has data, and left and right pointers */struct node{ int data; node* left; node* right;};/* This is the core function to convert Tree to list. This function followssteps 1 and 2 of the above algorithm */node* bintree2listUtil(node* root){ // Base case if (root == NULL) return root; // Convert the left subtree and link to root if (root->left != NULL) { // Convert the left subtree node* left = bintree2listUtil(root->left); // Find inorder predecessor. After this loop, left // will point to the inorder predecessor for (; left->right!=NULL; left=left->right); // Make root as next of the predecessor left->right = root; // Make predecssor as previous of root root->left = left; } // Convert the right subtree and link to root if (root->right!=NULL) { // Convert the right subtree node* right = bintree2listUtil(root->right); // Find inorder successor. After this loop, right // will point to the inorder successor for (; right->left!=NULL; right = right->left); // Make root as previous of successor right->left = root; // Make successor as next of root root->right = right; } return root;}// The main function that first calls bintree2listUtil(), then follows step 3 // of the above algorithmnode* bintree2list(node *root){ // Base case if (root == NULL) return root; // Convert to DLL using bintree2listUtil() root = bintree2listUtil(root); // bintree2listUtil() returns root node of the converted // DLL. We need pointer to the leftmost node which is // head of the constructed DLL, so move to the leftmost node while (root->left != NULL) root = root->left; return (root);}/* Helper function that allocates a new node with thegiven 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) { printf("%d ", 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 = bintree2list(root); // Print the converted list printList(head); return 0;}

 

转载地址:http://lyecl.baihongyu.com/

你可能感兴趣的文章
JS验证表单
查看>>
OpenERP安装定制过程实录
查看>>
分享一下我的vim配置
查看>>
Exchange Server如何检查服务器版本号
查看>>
01-SCOM 2012 R2 安装前准备
查看>>
sed对文本内容进行添加和删除
查看>>
Zookeeper初遇
查看>>
关于windows 双网卡和跃点数研究
查看>>
Android 建立文件夹、生成文件并写入文本文件内容
查看>>
三大特性与数据类型
查看>>
Linux安装配置***服务器
查看>>
hibernate4之 配置(一)
查看>>
安装grub的两种方法
查看>>
Centos6.5源码搭建SVN+Apache
查看>>
动态规划求组合系数
查看>>
SpringFramework之Servlet的request path
查看>>
filebeat导入Hadoop日志到Elasticsearch中
查看>>
LAMP平台部署及应用(2)——部署phpMyAdmin系统
查看>>
centos 开机启动服务设置
查看>>
HashMap源码分析
查看>>