二叉树转双向链表
来源:互联网 发布:手机申请域名 编辑:程序博客网 时间:2024/06/06 01:19
http://www.cppblog.com/whspecial/archive/2014/01/03/205123.html
将排序二叉树转换成双向链表
Posted on 2014-01-03 00:41 whspecial 阅读(2169) 评论(0) 编辑 收藏 引用 所属分类: 算法&&数据结构
将排序二叉树转化成双向链表,应该是一道很常见的面试题目,网上的实现比较多,有用递归也有用中序遍历法的。看到一位外国友人的实现,还是比较清晰的,思路如下:
1,如果左子树不为null,处理左子树
1.a)递归转化左子树为双向链表;
1.b)找出根结点的前驱节点(是左子树的最右的节点)
1.c)将上一步找出的节点和根结点连接起来
2,如果右子树不为null,处理右子树(和上面的很类似)
1.a)递归转化右子树为双向链表;
1.b)找出根结点的后继节点(是右子树的最左的节点)
1.c)将上一步找出的节点和根结点连接起来
3,找到最左边的节点并返回
附上国外友人的链接:http://www.geeksforgeeks.org/in-place-convert-a-given-binary-tree-to-doubly-linked-list/
下面是代码实现:
bintree2listUtil函数返回的node* 是root节点,bintree2list函数返回的是头节点
This is the core function to convert Tree to list. This function follows steps 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);
0 0
- 二叉树转双向链表
- 二叉树转双向链表
- 算法-二叉树转双向链表
- 算法-二叉树转双向链表
- 二叉树转双向链表
- 二叉树转双向链表
- 二叉树转双向链表
- 二叉搜索树转双向链表
- 二叉查找树转双向链表
- 搜索二叉树转双向链表
- 二叉搜索树转排序双向链表
- 二叉搜索树就地转双向链表C++
- 二叉查找树转双向链表(笔试)
- Tree2List二叉树转双向链表的实现
- 面试题:搜索二叉树转双向链表
- 【剑指offer】二叉搜索树转双向链表
- 剑指offer - 二叉搜索树转双向链表
- 【剑指offer】之二叉搜索树转双向链表
- phyton list排序
- 常用排序算法总结(二)
- java集合 - Collection - List - Set - Map - Iterator 学习笔记
- Java多线程系列目录
- c++第五次实验-字符串
- 二叉树转双向链表
- iOS 代理传值(逆传)
- android contentprovider
- C++/C|输入处理
- 【待重置】最小生成树各种题型
- 第5课:基于案例一节课贯通Spark Streaming流计算框架的运行源码
- 【图解HTTP笔记】第九章 基于HTTP功能的追加协议
- CSS basic interview questions
- Oracle 12c Windows安装、介绍及简单使用(图文)