编程算法 - 二叉搜索树 与 双向链表 代码(C++)
二叉搜索树 与 双向链表 代码(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++)的更多相关文章
- 编程算法 - 二叉搜索树(binary search tree) 代码(C)
二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...
- 剑指Offer(二十六):二叉搜索树与双向链表
剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- 剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- 《剑指offer》第三十六题(二叉搜索树与双向链表)
// 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...
- 【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...
- 剑指Offer - 九度1503 - 二叉搜索树与双向链表
剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
- 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树
剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...
随机推荐
- [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia
[BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...
- Three.js 类的粗略总结和实现
类 1.Cameras 照相机,包括很多种类型的摄像机类,包括正交类型和投影类型的摄像机 2.Core 核心对象 3.Lights 光照,包括点光,环境光,镜面光等等 4.Loaders 专门用来加载 ...
- ACM需要掌握算法
数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 一维线段树 二维 ...
- MyTalkStuffHomeIcon-2
圆形.高清头像素材专用-2
- Linux High Availabi RHCS
-----本文大纲 简介 术语 环境配置 实现过程 命令行管理工具 ------------- 一.简介 RHCS 即 RedHat Cluster Suite ,中文意思即红帽集群套件.红帽集群套件 ...
- jquery 图片预加载
/图片无序预加载 (function($){ function Preload(imgs,fns){ this.imgs=(typeof imgs==="string")?[img ...
- 重温PHP之插入排序
插入排序基本思路:将数组分为两个区(已排序区和未排序区),假定数组的第一个元素处于已排序区, 第一个元素之后的所有元素都处于未排序部分.排序时用到双层循环,外层循环用于从未排序部分中取出待排序元素,并 ...
- Hibernate: Implicit & Explicit Polymorphism
As I was going through the various inheritance strategies in Hibernate, I came across the ‘class’ el ...
- spring mvc 下 applicationContext 和webApplicationContext
spring中的ApplicationContexts可以被限制在不同的作用域.在web框架中,每个DispatcherServlet有它自己的WebApplicationContext,它包含了Di ...
- android 管理手机短信
为了看代码方便,一边在网上google资料,一边看Android java 源代码. 偶然发现了一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mm ...