二元查找树变双向链表
声明:取自 ”july“的“微软100题“,加上一些个人理解,欢迎拍砖。
原文地址:http://blog.csdn.net/v_july_v/article/details/6126406
学习微软100题笔记:
1.二元查找树变双向链表:
#include <stdio.h>
#include <iostream>
struct BSTreeNode
{
int m_nValue;
BSTreeNode *m_pLeft;
BSTreeNode *m_pRight;
};
typedef BSTreeNode DoubleList;
DoubleList * pHead;
DoubleList * pListIndex;
void convertToDoubleList(BSTreeNode * pCurrent);
BSTreeNode* addBSTreeNode(BSTreeNode * & pCurrent, int value)
{
if (NULL == pCurrent)
{
pCurrent = new BSTreeNode();
pCurrent->m_pLeft = NULL;
pCurrent->m_pRight = NULL;
pCurrent->m_nValue = value;
}
else if( pCurrent->m_nValue > value )
{
pCurrent->m_pLeft = addBSTreeNode( pCurrent->m_pLeft, value );
}
else if ( pCurrent->m_nValue< value )
{
pCurrent->m_pRight = addBSTreeNode(pCurrent->m_pRight, value);
}
else
{
std::cout<<"重复加入节点"<< std::endl;
}
return pCurrent;
}
void ergodicBSTree( BSTreeNode *pCurrent )
{
if( NULL == pCurrent )
{
return;
}
if( NULL != pCurrent->m_pLeft )
{
ergodicBSTree( pCurrent->m_pLeft );
}
convertToDoubleList( pCurrent );
if( NULL != pCurrent->m_pRight )
{
ergodicBSTree( pCurrent->m_pRight );
}
}
void convertToDoubleList( BSTreeNode *pCurrent )
{
pCurrent->m_pLeft = pListIndex;
if( NULL != pListIndex )
{
pListIndex->m_pRight = pCurrent;
}
else
{
pHead = pCurrent;
}
pListIndex = pCurrent;
std::cout << pCurrent->m_nValue << std::endl;
}
int
main( void )
{
BSTreeNode *pRoot = NULL;
pListIndex = NULL;
pHead = NULL;
addBSTreeNode(pRoot, 10);
addBSTreeNode(pRoot, 4);
addBSTreeNode(pRoot, 6);
addBSTreeNode(pRoot, 8);
addBSTreeNode(pRoot, 12);
addBSTreeNode(pRoot, 14);
addBSTreeNode(pRoot, 15);
addBSTreeNode(pRoot, 16);
ergodicBSTree(pRoot);
return 0;
}
其中建立二叉树时是按照 c语言程序设计中(K&R)方法建立的,大同小异。
重点是利用递归转换为链表的过程。
一个全局指针pListIndex指向pCurrent的前一个节点,每次调用convertToDoubleList完成
pCurrent->m_pRight -> pListIndex;因为这里pCurrent不为NULL,然后再pListIndex->m_pLift 指向当前pCurrent
要先判断pListIndex是否为NULL,因为pListIndex开始时是赋值为NULL的,不能进行解引用操作。
新手没经验,欢迎指正错误,待更新。详细请见开头原博文 ,july大神。
转载于:https://www.cnblogs.com/newbeeyu/p/5290723.html
二元查找树变双向链表相关推荐
- (三)二元查找树转换双向链表
题意:不引入新节点,只允许指针操作,实现二元查找树转换为相应双向链表. 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14= ...
- 把二元查找树转变成排序的双向链表
题目: 输入一颗二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 转换成双向链表4=6=8=10=12=14=16 首先,我们定义的二元查找树结点的数据 ...
- 数据结构 - 把二元查找树转变成排序的双向链表(C++)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...
- 把二元查找树转变成排序的双向链表(树)
1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14 / \ / \ 4 8 ...
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 ...
- 微软面试题1、把二元查找树转变成排序的双向链表
题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. 要求不能创建任何新的结点,只调整指针的指向. 10 / / 6 14 / / / / 4 8 12 16 ...
- 数据结构 - 二元查找树
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 二元查找 ...
- 输入一颗二元查找树,将该树转换为它的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点. 例如输入: 8 / \ 6 10 /\ /\ 5 7 9 11 输出: 8 / \ 10 6 ...
- 程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成树的镜像转换. 例如输入: 8 / \ 6 1 ...
最新文章
- 自动调试用于移动GPU的卷积网络
- maven 错误处理
- PMCAFF | 产品经理的招聘要求调研分析
- java错误:The superclass javax.servlet.http.HttpServlet was not found on the Java Bu
- SpringMVC的请求-文件上传-单文件上传的代码实现2
- Django-C001-快速入门
- 用Markdown写博客快速入门
- 计算几何 —— 二维几何基础 —— 三角形的面积
- Java中二维数组和面向对象
- cuda11.0 cudnn 11.0 torch1.7.1+cu110 torchvision 0.8.2+cu110 安装包
- mysql索引的创建和删除吗_MySQL索引的创建、删除和查看
- adapthisteq和histeq
- 10月| R社区原创作者免费赠书
- SLAM基础_从零开始一起学习SLAM | 为啥需要李群与李代数?
- HDU6287 口算训练 【两种优化版分解质因数】【二分下标】
- HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活
- 学习笔记(109):R语言入门基础-text函数
- 网络安全-古典加密算法之置换密码加解密算法
- HTML5:<abbr>元素
- 计算机组成原理-课设
热门文章
- Silverlight开发历程—(绘制矢量图之Polyline 和 Polygon)
- 阿里再添AI新物种,消费者天猫双11网上逛“视觉超市”
- Unity3D手机斗地主游戏开发实战(03)_地主牌显示和出牌逻辑
- 《马哥教育协办GIAC、GOPS顶级技术峰会完美落幕》
- 点击文字弹出一个DIV层窗口代码
- delphi 使用UDP收发数据
- Socket2实现tcp端口扫描
- android graphic:canvas
- hdu 3449 Consumer 01背包
- FCKEditor最新上传漏洞(ASP),允许上传“.asp;jpg”类型文件解决方案