把二元查找树转变成排序的双向链表
来源:互联网 发布:淘宝买衣服靠谱吗 编辑:程序博客网 时间:2024/06/14 09:02
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
#include <stdio.h>#include <stdlib.h>#include <string.h>/*说明:本文参考http://blog.csdn.net/chdhust/article/details/8175480主要思想是递归思路*/typedef struct BiNode{ struct BiNode* lNode; struct BiNode* rNode; int data;}*BiTree;void createTree(BiTree &T, int *data, int pos, int len){ if (pos >= len) { T = NULL; return; } T = (BiTree)malloc(sizeof(BiNode)); T->data = data[pos]; T->lNode = NULL; T->rNode = NULL; createTree(T->lNode, data, pos*2+1, len); createTree(T->rNode, data, pos*2+2, len);}/*先序,中-->左-->右*/void preOrderTree(BiTree T){ if (T == NULL) { return; } printf("%d \t", T->data); preOrderTree(T->lNode); preOrderTree(T->rNode);}/*中序,左-->中-->右*/void inOrderTree(BiTree T){ if (T == NULL) { return; } inOrderTree(T->lNode); printf("%d \t", T->data); inOrderTree(T->rNode);}/*后序,左-->右-->中*/void postOrderTree(BiTree T){ if (T == NULL) { return; } postOrderTree(T->lNode); postOrderTree(T->rNode); printf("%d \t", T->data);}/*说明:T为转换的树, lastListNode为双向链表的尾结点*/void convertTreeToList(BiTree T, BiTree &lastListNode){ BiNode* curNode = NULL; if (T == NULL) { return; } /*按照中序处理*/ curNode = T; if (curNode->lNode != NULL) { convertTreeToList(curNode->lNode, lastListNode); } /*把当前结点添加到尾结点*/ curNode->lNode = lastListNode; if (lastListNode != NULL) { lastListNode->rNode = curNode; } /*更新尾结点*/ lastListNode = curNode; if (curNode->rNode != NULL) { convertTreeToList(curNode->rNode, lastListNode); }}/*将树T转换为双向链表,返回双向链表的头结点*/BiTree convert(BiTree T){ BiTree doubleList = NULL; convertTreeToList(T, doubleList); /*转换后所指向的结点为尾结点,需要找到头结点*/ while (doubleList!=NULL && doubleList->lNode!=NULL) { doubleList = doubleList->lNode; } return doubleList;}void printList(BiTree list){ BiTree p = list; while (p != NULL) { printf("%d\t", p->data); p = p->rNode; } printf("\n");}int main(){ BiTree T = NULL; BiTree list = NULL; int data[] = {10, 6, 14, 4, 8, 12, 16}; createTree(T, data, 0, 7); printf("前序遍历树:\n"); preOrderTree(T); printf("\n"); printf("中序遍历树:\n"); inOrderTree(T); printf("\n"); printf("后序遍历树:\n"); postOrderTree(T); printf("\n"); list = convert(T); printf("将树转换为双向链表后:\n"); printList(list); return 0;}
0 0
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- .把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- vi常用命令
- 矩阵的转置
- 如何获取到经纬度和位置
- 程怀亮(
- 【BZOJ】【P1361】【Wc2004】【孪生项链】【题解】【Lyndon Word+构造】
- 把二元查找树转变成排序的双向链表
- 程咬金
- 最近负责的一些东西,编程就是有点累而已
- 子序列个数
- Velocity教程
- maven构建hibernate框架
- 最长递增子序列
- 我知道的IT外企
- MongoDb1.1 读操作的实现细节