二叉搜索树 与 双向链表 代码(C++)

本文地址: http://blog.csdn.net/caroline_wendy

题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表.

要求不能创建不论什么新的结点, 仅仅能调整数中结点的指针的指向.

方法: 使用中序遍历每个结点, 并进行连接, 即左子树指前, 右子树指后, 并保存前一个节点.

本程序包括算法原理, 測试程序, 及 输出.

/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <iostream>
#include <stack>
#include <queue> using namespace std; struct BinaryTreeNode {
int value;
BinaryTreeNode* left;
BinaryTreeNode* right;
}; void printTree (BinaryTreeNode* tree)
{
BinaryTreeNode* node = tree;
std::queue<BinaryTreeNode*> temp1;
std::queue<BinaryTreeNode*> temp2; temp1.push(node); while (!temp1.empty())
{
node = temp1.front();
if (node->left != NULL) {
temp2.push(node->left);
} if (node->right != NULL) {
temp2.push(node->right);
} temp1.pop(); std::cout << node->value << " "; if (temp1.empty())
{
std::cout << std::endl;
temp1 = temp2;
std::queue<BinaryTreeNode*> empty;
std::swap(temp2, empty);
}
}
} BinaryTreeNode* buildTree (const std::vector<int>& L)
{
if (L.empty())
return nullptr; std::queue<BinaryTreeNode*> parentQueue;
std::queue<BinaryTreeNode*> childQueue; BinaryTreeNode* root = new BinaryTreeNode();
root->value = L[0]; parentQueue.push(root); std::size_t times = 1;
while (times < L.size())
{
BinaryTreeNode* parent = parentQueue.front();
parentQueue.pop(); BinaryTreeNode* lchild = new BinaryTreeNode();
lchild->value = L[times];
lchild->left = nullptr;
lchild->right = nullptr;
++times; parent->left = lchild;
childQueue.push(lchild); if (times == L.size()) break; BinaryTreeNode* rchild = new BinaryTreeNode();
rchild->value = L[times];
rchild->left = nullptr;
rchild->right = nullptr;
++times; parent->right = rchild;
childQueue.push(rchild); if (parentQueue.empty()) {
parentQueue = childQueue;
std::queue<BinaryTreeNode*> empty;
std::swap(childQueue, empty);
}
} return root;
} void printList (BinaryTreeNode* pHeadOfList)
{
while (pHeadOfList != NULL && pHeadOfList->right != NULL)
{
std::cout << pHeadOfList->value << " ";
pHeadOfList = pHeadOfList->right;
} std::cout << pHeadOfList->value << " ";
std::cout << std::endl; return;
} void ConvertNode(BinaryTreeNode* root, BinaryTreeNode*& pLast)
{
if (root == NULL)
return; BinaryTreeNode* current = root; if (current->left != NULL)
ConvertNode(current->left, pLast); current->left = pLast;
if (pLast != NULL)
pLast->right = current; pLast = current; if (current->right != NULL)
ConvertNode(current->right, pLast);
} BinaryTreeNode* Convert(BinaryTreeNode* root)
{
BinaryTreeNode* pLast = NULL;
ConvertNode(root, pLast); BinaryTreeNode* head = pLast; while (head != NULL && head->left != NULL)
head = head->left; return head;
} int main (void)
{
std::vector<int> L = {10, 6, 14, 4, 8, 12, 16};
BinaryTreeNode* tree = buildTree(L);
std::cout << "----Tree:----\n";
printTree(tree);
BinaryTreeNode* list = Convert(tree);
std::cout << "----List:----\n";
printList(list);
return 0;
}


输出:

----Tree:----
10
6 14
4 8 12 16
----List:----
4 6 8 10 12 14 16

编程算法 - 二叉搜索树 与 双向链表 代码(C++)的更多相关文章

  1. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  2. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  3. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

  4. 剑指 Offer 36. 二叉搜索树与双向链表

    剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...

  5. 《剑指offer》— JavaScript(26)二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...

  6. 《剑指offer》第三十六题(二叉搜索树与双向链表)

    // 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...

  7. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  8. 剑指Offer - 九度1503 - 二叉搜索树与双向链表

    剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...

  9. 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树

    剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...

随机推荐

  1. CF 277.5 A.SwapSort 水题

    //STL教你做人系列 #include<stdio.h> #include<iostream> #include<math.h> #include<algo ...

  2. 无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的COM 对象强制转换为接口类型“Microsoft.Office.Interop.Excel._Application”

    报错内容如下: 无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的COM对象强制转换为接口类型“Microsoft.Office.Inte ...

  3. Shell脚本里的双冒号是什么意思

    这个是代码开发风格,其实也就是一个函数名,相当于下划线分割,但改读成包名之后就意义不一样.这个是根据Google的Shell开发规范进行定义的. 参考: https://google.github.i ...

  4. Tasker to create toggle widget for ES ftp service -- Send Intent

    To perform this mission, Tap the tab "tasks" of Tasker, create a task as below.Task: (ES F ...

  5. MyBatis入门实例-包括实体类与数据库字段对应&CLOB字段处理

    1.我的开发环境是 jdk1.7+ecplise+oracle 11g 用到的jar包:mybatis-3.1.1.jar ojdbc6.jar 2.项目整体结构     3.首先配置conf.xml ...

  6. tomcat ssi配置及升级导致ssi include错误问题解决

    最近tomcat升级版本时,遇到了ssi解析的问题,记录下解决的过程,还有tomcat ssi配置的要点. tomcat 配置SSI的两种方式 Tomcat有两种方式支持SSI:Servlet和Fil ...

  7. WINDOWS 线程 纤程 进程

    http://www.cnblogs.com/edisonchou/p/4848131.html#3277980

  8. C++STL源代码学习(之slist篇)

    ///stl_slist.h ///list为双向循环链表,slist为单向链表.某些操作效率更高 ///slist是SGI额外提供的单向链表,不属于C++标准 struct _Slist_node_ ...

  9. 在Win7环境下安装启动Linux

    在Win7环境下安装启动Linux 在Win7系统下,安装启动Linux特别的不方便,由于XP下的boot.ini配置文件不在了,要加入�一下启动选项的话, 仅仅能使用专门的工具,这或多或少给人带来不 ...

  10. 去除ArcMap连接空间数据库中多余的属性表

    这个操作目前可能不具有可行性,但是为了完整性还是在下面讲一下吧.如有兴趣的小伙伴,可以按照下面的操作方式去尝试. 一.需求 去除ArcMap连接空间数据库中多余的属性表. PL/SQL中查询得到的内容 ...