每天学一个算法(2)------二元查找树转变成排序的双向链表
2016-06-23 09:28
756 查看
题目:
把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
思路:
一看到这样的问题首先想到的是二叉树的遍历问题,具体是前序,中序,后序遍历主要是看问题如何描述,而这里刚好可以用中序遍历,在遍历的过程中不断的调整Left,Right指针,使之满足要求.
下面给出算法的实现:
[cpp] view
plain copy
/*
---------------------------------------------
原作者tree_star
2010年 10月18日下午 July
Modified by yuucyf 2011.04.21
---------------------------------------------
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
/ /
7 9
转换成双向链表
4=6=7=8=9=10=12=14=16。
*/
#include "stdafx.h"
#include <assert.h>
#include <iostream>
using namespace std;
typedef struct tagTreeNode
{
int nValue;
tagTreeNode *psLeftNode;
tagTreeNode *psRightNode;
tagTreeNode()
{
nValue = 0;
psLeftNode = psRightNode = NULL;
}
}S_BSTreeNode;
typedef S_BSTreeNode S_DoubleListNode;
S_DoubleListNode * g_psListIndex = NULL;
//创建二叉查找树.
void AddBSTreeNode(S_BSTreeNode * &psCurNode, int nValue)
{
if (NULL == psCurNode)
{
S_BSTreeNode *psNode = new S_BSTreeNode;
assert(NULL != psNode);
psNode->nValue = nValue;
psNode->psLeftNode = NULL;
psNode->psRightNode = NULL;
psCurNode = psNode;
}
else
{
if (psCurNode->nValue > nValue)
{
AddBSTreeNode(psCurNode->psLeftNode, nValue);
}
else if (psCurNode->nValue < nValue)
{
AddBSTreeNode(psCurNode->psRightNode, nValue);
}
else
{
cout << "不允许插入重复值" << endl;
}
}
}
//把二叉查找树转换为Double List.
void ConvertBSTree2DoubleList(S_BSTreeNode *psCurNode)
{
if (NULL == psCurNode) return;
psCurNode->psLeftNode = g_psListIndex;
if (NULL != g_psListIndex)
g_psListIndex->psRightNode = psCurNode;
g_psListIndex = psCurNode;
cout << psCurNode->nValue << endl;
}
//以中序遍历二叉查找树.
void ErgodicBSTree(S_BSTreeNode *psCurNode)
{
if (NULL == psCurNode) return;
if (psCurNode->psLeftNode)
ErgodicBSTree(psCurNode->psLeftNode);
ConvertBSTree2DoubleList(psCurNode);
if (psCurNode->psRightNode)
ErgodicBSTree(psCurNode->psRightNode);
}
int _tmain(int argc, _TCHAR* argv[])
{
S_BSTreeNode *psRoot = NULL;
AddBSTreeNode(psRoot, 10);
AddBSTreeNode(psRoot, 4);
AddBSTreeNode(psRoot, 6);
AddBSTreeNode(psRoot, 8);
AddBSTreeNode(psRoot, 12);
AddBSTreeNode(psRoot, 14);
AddBSTreeNode(psRoot, 15);
AddBSTreeNode(psRoot, 16);
AddBSTreeNode(psRoot, 7);
AddBSTreeNode(psRoot, 9);
ErgodicBSTree(psRoot);
return 0;
}
把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
思路:
一看到这样的问题首先想到的是二叉树的遍历问题,具体是前序,中序,后序遍历主要是看问题如何描述,而这里刚好可以用中序遍历,在遍历的过程中不断的调整Left,Right指针,使之满足要求.
下面给出算法的实现:
[cpp] view
plain copy
/*
---------------------------------------------
原作者tree_star
2010年 10月18日下午 July
Modified by yuucyf 2011.04.21
---------------------------------------------
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
/ /
7 9
转换成双向链表
4=6=7=8=9=10=12=14=16。
*/
#include "stdafx.h"
#include <assert.h>
#include <iostream>
using namespace std;
typedef struct tagTreeNode
{
int nValue;
tagTreeNode *psLeftNode;
tagTreeNode *psRightNode;
tagTreeNode()
{
nValue = 0;
psLeftNode = psRightNode = NULL;
}
}S_BSTreeNode;
typedef S_BSTreeNode S_DoubleListNode;
S_DoubleListNode * g_psListIndex = NULL;
//创建二叉查找树.
void AddBSTreeNode(S_BSTreeNode * &psCurNode, int nValue)
{
if (NULL == psCurNode)
{
S_BSTreeNode *psNode = new S_BSTreeNode;
assert(NULL != psNode);
psNode->nValue = nValue;
psNode->psLeftNode = NULL;
psNode->psRightNode = NULL;
psCurNode = psNode;
}
else
{
if (psCurNode->nValue > nValue)
{
AddBSTreeNode(psCurNode->psLeftNode, nValue);
}
else if (psCurNode->nValue < nValue)
{
AddBSTreeNode(psCurNode->psRightNode, nValue);
}
else
{
cout << "不允许插入重复值" << endl;
}
}
}
//把二叉查找树转换为Double List.
void ConvertBSTree2DoubleList(S_BSTreeNode *psCurNode)
{
if (NULL == psCurNode) return;
psCurNode->psLeftNode = g_psListIndex;
if (NULL != g_psListIndex)
g_psListIndex->psRightNode = psCurNode;
g_psListIndex = psCurNode;
cout << psCurNode->nValue << endl;
}
//以中序遍历二叉查找树.
void ErgodicBSTree(S_BSTreeNode *psCurNode)
{
if (NULL == psCurNode) return;
if (psCurNode->psLeftNode)
ErgodicBSTree(psCurNode->psLeftNode);
ConvertBSTree2DoubleList(psCurNode);
if (psCurNode->psRightNode)
ErgodicBSTree(psCurNode->psRightNode);
}
int _tmain(int argc, _TCHAR* argv[])
{
S_BSTreeNode *psRoot = NULL;
AddBSTreeNode(psRoot, 10);
AddBSTreeNode(psRoot, 4);
AddBSTreeNode(psRoot, 6);
AddBSTreeNode(psRoot, 8);
AddBSTreeNode(psRoot, 12);
AddBSTreeNode(psRoot, 14);
AddBSTreeNode(psRoot, 15);
AddBSTreeNode(psRoot, 16);
AddBSTreeNode(psRoot, 7);
AddBSTreeNode(psRoot, 9);
ErgodicBSTree(psRoot);
return 0;
}
相关文章推荐
- 获取对象中的值的方法
- 阅读笔记《构建之法》四
- 计算机程序的思维逻辑 (20) - 为什么要有抽象类?
- c++学习心得
- iOS 提交报错 Error ITMS-90635 - Invalid Mach-O in bundle - submitting to App store
- 技术学习
- iOS 加急审核的办法
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method
- Beta阶段项目总结
- 旅行喵 React Native 技术实践
- zynq u-boot配置
- 关于ScrollView和WebView滑动事件冲突的解决办法
- 直系血亲和旁系血亲
- Unable to compile class for JSP org.apache.jasper.JasperException: Unable to compile class for JSP
- 关于结构体变量为什么要使用new 增加空间的疑惑
- 阅读笔记《构建之法》三
- Android性能调优利器StrictMode
- 数字证书的授权链
- 使用Spring的JdbcTemplate简化jdbc操作
- zynq gpio管脚配置