将二叉排序树BST转换成排序的双向链表
2012-11-04 22:24
337 查看
#include <iostream> using namespace std; /** * 递归实现将二叉排序树BST转换成排序的双向链表。 * 递归左子树,将左子树的转换成的链表的尾节点和当前根节点连接, * 然后当前根节点更新尾转换好链表的尾节点。 递归右子树 */ typedef struct node{ int value; struct node *lchild; struct node *rchild; }NODE; NODE *createNode(int v){ NODE *p = (NODE *)malloc(sizeof(NODE)); p->value = v; p->lchild = NULL; p->rchild = NULL; return p; } //创建一棵树作为测试 NODE *buildTree(){ NODE *root,*p,*q; root = createNode(8); p = createNode(4); root->lchild = p; q = createNode(3); p->lchild = q; q = createNode(6); p->rchild = q; p = q; q = createNode(5); p->lchild = q; p = createNode(10); root->rchild = p; q = createNode(9); p->lchild = q; q = createNode(12); p->rchild = q; return root; } /** * 将BST递归转换成双向排序链表,随时维护已转换好的链表的尾节点 */ void transformToList(NODE *root, NODE **listLastNode){ //空节点,不进行任何转换 if(root == NULL) return; //如果左子树不空,递归左子树 if(root->lchild != NULL){ transformToList(root->lchild, listLastNode); } //将自己和左子树转换成的链表的最后一个节点相互连接 if(*listLastNode != NULL) (*listLastNode)->rchild = root; root->lchild = *listLastNode; //把当前节点作为转换好的链表的尾节点,递归处理右子树 //右子树递归到最左孩子的时候,会和listLastNode相互连接的 *listLastNode = root; if(root->rchild != NULL){ transformToList(root->rchild, listLastNode); } } int main(){ NODE *listLastNode = NULL; NODE *root = buildTree(); //转换 transformToList(root, &listLastNode); //逆序输出 while(listLastNode != NULL){ cout<<listLastNode->value<<" "; listLastNode = listLastNode->lchild; } cout<<endl; return 0; }
相关文章推荐
- 前序和中序重建二叉树、二叉排序树转换为排序的双向链表
- 二叉排序树转换成排序的双向链表
- 1、如何将二叉排序树转换为排序的双向链表
- 1将该二元查找树转换成一个排序的双向链表
- 把二元查找树转换成排序的双向链表
- 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
- 第1题:把二叉搜索树转换为一个排序的双向链表
- 每天学习一算法系列(2)(把二元查找树转变成排序的双向链表,要求输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.)
- 把BST转换为双向链表
- 微软100道算法题第一题------二叉排序树变成排序的双向链表
- 微软面试100题系列---把二叉查找树转换成排序的双向链表
- day17之将二叉搜索树转换成一个排序的双向链表
- 将二叉搜索树转换成一个排序的双向链表
- 二叉排序树转换成双向链表
- 第10题 把二元查找树转换成排序的双向链表
- 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
- 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。
- 将二叉搜索树转换成一个排序双向链表
- 微软,Google面试题 (1) —— 把二叉排序树转变成排序的双向链表
- 二叉排序树与双向链表的转换