(017)将一棵二叉查找树重构成链表(keep it up)
2014-09-01 01:01
447 查看
给定一棵二叉查找树,设计算法,将每一层的所有结点构建为一个
链表(也就是说, 如果树有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;
}
链表(也就是说, 如果树有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)
- 026从尾到头打印链表(keep it up)
- (016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)
- 034链表中倒数第k个结点(keep it up)
- (016)给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树(keep it up)
- 019写程序在一棵二叉树中找到两个结点的最近共同祖先(keep it up)
- 006矩阵旋转90度(keep it up)
- 021位操作1(keep it up)
- 008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
- 031 二进制中1的个数(keep it up, 看到这个题刚开始有点蒙)
- 004字符串去重 (keep it up)
- 029斐波那契数列的矩阵解法(keep it up)
- 032数值的整数次方(keep it up)
- 009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)
- 009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)
- (015)实现一个函数来检查是否平衡树(keep it up)
- 033 调整数组顺序使奇数位于偶数前面(keep it up)
- 004串重量 (keep it up)
- 014敲代码将一个栈按升序排序,对这个栈是怎样实现的,你不应该做不论什么特殊的如果(keep it up)
- How to sync a fork repo to keep it up-to-date with the upstream repo on Windows?