(017)将一棵二叉查找树重构成链表(keep it up)
给定一棵二叉查找树,设计算法,将每一层的全部结点构建为一个
链表(也就是说, 假设树有D层,那么你将构建出D个链表).
这个题实质是个BFS,可是实现起来有点麻烦,又不像常见的BFS,
所以编写代码时有点艰难。
以下的代码使用两个list来实现层次遍历的,首先用Cur链表存储当前层
的结点,然后用Pre链表存储当前层的子层结点,Cur和Pre。下一次遍历时
Pre就变成当前层,Cur就变成它的子层。这样交替运行。
代码:
struct TreeNode
{
int data;
TreeNode* leftChild;
TreeNode* rightChild;
}; void createLinks(const TreeNode* vRoot, std::vector<std::list<TreeNode*>>& vListVec)
{
if (vRoot == NULL) return;
vListVec.clear(); std::list<TreeNode*> Pre;
std::list<TreeNode*> Cur;
std::list<TreeNode*>* pList;
Cur.push_back(vRoot);
vListVec.push_back(Cur); pList = &Cur;
bool IsCur = true;
while (pList->empty())
{
if (IsCur)
{
while (pList->empty())
{
TreeNode* Tmp = pList->front();
pList->pop_front();
if (Tmp->leftChild) Pre.push_back(Tmp->leftChild);
if (Tmp->rightChild) Pre.push_back(Tmp->rightChild);
}
IsCur = false;
pList = &Pre;
vListVec.push_back(Pre);
}
else
{
while (pList->empty())
{
TreeNode* Tmp = pList->front();
pList->pop_front();
if (Tmp->leftChild) Cur.push_back(Tmp->leftChild);
if (Tmp->rightChild) Cur.push_back(Tmp->rightChild);
}
IsCur = true;
pList = Cur;
vListVec.push_back(Cur);
}
}
}
给定一个有向图,设计算法推断两结点间是否存在路径。
常见的BFS。
代码:
struct GraphNode
{
int data;
GraphNode* next;
} bool judge(const GraphNode* vBgn, const GraphNode* vEnd)
{
if (vBgn == NULL || vEnd == NULL) return false;
std::map<GraphNode*, bool> MapV;
std::queue<GraphNode*> Que;
Que.push(vBgn);
MapV[vBgn] = true; while (!Que.empty())
{
GraphNode* Tmp = Que.front();
Que.pop(); while (Tmp->next)
{
Tmp = Tmp->next;
if (MapV.find(Tmp) != MapV.end())
{
if (Tmp == vEnd) return true;
MapV[Tmp] = true;
Que.push(Tmp);
}
}
} return false;
}
(017)将一棵二叉查找树重构成链表(keep it up)的更多相关文章
- LintCode-378.将二叉查找树转换成双链表
将二叉查找树转换成双链表 将一个二叉查找树按照中序遍历转换成双向链表. 样例 给定一个二叉查找树: 返回 1<->2<->3<->4<->5. 标签 链 ...
- lintcode 453 将二叉树拆成链表
将二叉树拆成链表 描述 笔记 数据 评测 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标 ...
- [LeetCode] Flatten Binary Tree to Linked List 将二叉树展开成链表
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)
题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ...
- [LeetCode] 114. Flatten Binary Tree to Linked List 将二叉树展开成链表
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...
- lintcode:将二叉查找树转换成双链表
题目 将一个二叉查找树按照中序遍历转换成双向链表 给定一个二叉查找树: 4 / \ 2 5 / \ 1 3 返回 1<->2<->3<->4<->5. ...
- lintcode:将二叉树拆成链表
题目 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标记为 null,否则你可能会得到空间溢出 ...
- 如何把if-else代码重构成高质量代码
原文:https://blog.csdn.net/qq_35440678/article/details/77939999 本文提纲: 为什么我们写的代码都是if-else? 这样的代码有什么缺点? ...
- Lintcode---将二叉树拆成链表
将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时 ...
随机推荐
- express for node 路由route几种实现方式的思考
1.路由实现方式和顺序 express框架创建的模板app,js中默认代码 var express = require('express'); var routes = require('./rout ...
- Get RSA public key ASN.1 encode from a certificate in DER format
RSA public key ASN.1 encode is defined in PKCS#1 as follows: RSAPublicKey :: = SEQUENCE { modul ...
- Twenty Newsgroups Classification任务之二seq2sparse(2)
接上篇,SequenceFileTokenizerMapper的输出文件在/home/mahout/mahout-work-mahout0/20news-vectors/tokenized-docum ...
- Lucene之删除索引
1.前言 之前的博客<Lucene全文检索之HelloWorld>已经简单介绍了Lucene的索引生成和检索.本文着重介绍Lucene的索引删除. 2.应用场景: 索引建立完成后,因为有些 ...
- vim Diff,Easy,Read-Only 的区别
我用的是vim 7.4,在windows上面安装完 vim 之后会出现不同的vim图标,gVim ,vim gVim 是在windows下的Gui图形用户界面的的 vim (GUI Vim),支持wi ...
- 【IUML】支持向量机SVM
从1995年Vapnik等人提出一种机器学习的新方法支持向量机(SVM)之后,支持向量机成为继人工神经网络之后又一研究热点,国内外研究都很多.支持向量机方法是建立在统计学习理论的VC维理论和结构风险最 ...
- IOT和HEAP表区别
Index Organized table by itself is a B-tree index. Index key is the primary key and the rest of colu ...
- [面经] 南京SAP面试(上)
背景 博主乃985弱校的小硕一枚,在南京某外企工作了两年,如今的公司还不错,待遇还行,做的东西也比較有意思.在南京这个地方,给力的公司不太多,仅仅要是跟亲戚朋友聊到我在南京做IT,无一例外都会问&qu ...
- mina的编码和解码以及断包的处理,发送自己定义协议,仿qq聊天,发送xml或json
近期一段时间以来,mina非常火,和移动开发一样.异常的火爆.前面写了几篇移动开发的文章,都还不错.你们的鼓舞就是我最大的动力.好了,废话少说.我们来看下tcp通讯吧. tcp通讯对于java来说是非 ...
- Codechef Not a Triangle题解
找出一个数组中的三个数,三个数不能组成三角形. 三个数不能组成三角形的条件是:a + b < c 两边和小于第三边. 这个问题属于三个数的组合问题了.暴力法可解,可是时间效率就是O(n*n*n) ...