算法-二叉树转双向链表
来源:互联网 发布:逍遥网络加速器 编辑:程序博客网 时间:2024/05/21 13:54
1.首先看二叉树和双向链表的结构体:
双向链表存储结构如下:
typedef struct DulNode{ ElemType data; struct DulNode *prior; struct DulNode *next;}
二叉树的二叉链表存储结构如下:
typedef stuct BiTNode{ TElemType data; struct BiTNode *lchild; struct BiTNode *rchild;}
2.原题:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
分析:
首先是定义二元查找树,节点的数据结构如下:
struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node};
再来分析题目要求,不能创建任何新的节点,所以我们借助以下语句来实现节点之间的转换
typedef BSTreeNode DoubleList;DoubleList * pHead;DoubleList * pListIndex;
ps:这里是定义而不是创建!
之后就是定义三个功能函数了:
1.创建二元查找树的addBSTreeNode(BSTreeNode * & pCurrent,int value);
2.遍历二元查找树的void ergodicBSTree(BSTreeNode * pCurrent);
3.二叉树转换成list的
convertToDoubleList(BSTreeNode * pCurrent);
3.源码:
借用结构之法算法之道博主July写的源码
#include <stdio.h>#include <iostream.h>struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node};typedef BSTreeNode DoubleList;DoubleList * pHead;DoubleList * pListIndex;void convertToDoubleList(BSTreeNode * pCurrent);// 创建二元查找树void addBSTreeNode(BSTreeNode * & pCurrent, int value)//传的是pRoot的地址,所以对pCurrent的操作就是对pRoot的操作{ if (NULL == pCurrent) { BSTreeNode * pBSTree = new BSTreeNode(); pBSTree->m_pLeft = NULL; pBSTree->m_pRight = NULL; pBSTree->m_nValue = value; pCurrent = pBSTree; } else { if ((pCurrent->m_nValue) > value) { addBSTreeNode(pCurrent->m_pLeft, value); } else if ((pCurrent->m_nValue) < value) { addBSTreeNode(pCurrent->m_pRight, value); } else { //cout<<"重复加入节点"<<endl; } }}// 遍历二元查找树 中序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); }}// 二叉树转换成listvoid convertToDoubleList(BSTreeNode * pCurrent){ pCurrent->m_pLeft = pListIndex; if (NULL != pListIndex) { pListIndex->m_pRight = pCurrent; } else { pHead = pCurrent; } pListIndex = pCurrent; cout<<pCurrent->m_nValue<<endl;}int main(){ 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;}
ps:写的不错,July在算法上有非常深的功底,他的博文主页:http://my.csdn.net/v_july_v
- 算法-二叉树转双向链表
- 算法-二叉树转双向链表
- [算法学习]二叉搜索树转双向链表
- (算法)二叉树转换为双向链表
- 二叉搜索树转为双向链表(算法)
- 算法基础 - 二叉查找树变成有序双向链表
- 算法题:二叉搜索树与双向链表
- 算法题目---二叉搜索树与双向链表
- 二叉树转双向链表
- 二叉树转双向链表
- 二叉树转双向链表
- 二叉树转双向链表
- 二叉树转双向链表
- 二叉搜索树转双向链表
- 二叉查找树转双向链表
- 搜索二叉树转双向链表
- 笔试面试算法经典--二叉搜索树转有序的双向链表(Java)
- 算法题24 二叉树的中序遍历之二叉搜索树转排序双向链表
- 解决不联网无法启动struts2问题
- Hadoop运维记录
- C++11 随机数
- Android中解决手机屏幕横竖屏切换问题
- C#操作XML
- 算法-二叉树转双向链表
- 【简单项目框架一】Fragment实现的底部导航
- Struts2的工作流程和容易忽略的问题
- SVN代码托管服务器
- windows 7 下快速搭建php环境(windows7+IIS7+php+mysql)
- Apache Sqoop
- 干净的table view 代码
- windows远程登录linux服务器,查看文件夹
- Git详解之一 Git起步