博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将二叉查找树转化为链表的代码实现
阅读量:6303 次
发布时间:2019-06-22

本文共 3332 字,大约阅读时间需要 11 分钟。

题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。

根据提供的思路,我自己写了一个读入任意序列的整数,建立二叉查找树再改成链表的C++代码:

#include 
#include
#include
using namespace std;// binary search tree nodestruct BSTreeNode{ int value; struct BSTreeNode *leftChild; struct BSTreeNode *rightChild;};void addBSTreeNode(struct BSTreeNode **ppRoot/*double pointer to the root*/, int new_value);void printBSTree(ofstream *fout, struct BSTreeNode *root, int level);void treeToLinkedList(struct BSTreeNode **ppHead, struct BSTreeNode **ppTail, struct BSTreeNode *root);int main() { ifstream fin ("tree_to_linked_list.in"); ofstream fout ("tree_to_linked_list.out"); int in; struct BSTreeNode *root = NULL, *head = NULL, *tail = NULL, *node = NULL; if(fin.good() == false) { cerr << "file open failed" << endl; return 0; } while(true) { if(fin.eof()) break; fin >> in; addBSTreeNode(&root, in); } printBSTree(&fout, root, 0); fout << endl; treeToLinkedList(&head, &tail, root); for(node = head; node != NULL; node = node->rightChild) { fout << node->value << " "; } fout << endl; for(node = tail; node != NULL; node = node->leftChild) { fout << node->value << " "; } fout << endl; return 0;}void addBSTreeNode(struct BSTreeNode **ppRoot/*double pointer to the root*/, int new_value){ if(*ppRoot == NULL) { *ppRoot = new struct BSTreeNode(); (*ppRoot)->value = new_value; return; } if(new_value == (*ppRoot)->value) { return; } else if(new_value < (*ppRoot)->value) { addBSTreeNode(&(*ppRoot)->leftChild, new_value); } else { addBSTreeNode(&(*ppRoot)->rightChild, new_value); }}void printBSTree(ofstream *pFout, struct BSTreeNode *root, int level){ if(root == NULL) return; printBSTree(pFout, root->leftChild, level + 1); int i; for(i = 0; i < level; i ++) (*pFout) << "\t"; (*pFout) << root->value << endl; printBSTree(pFout, root->rightChild, level + 1);}void treeToLinkedList(struct BSTreeNode **ppHead, struct BSTreeNode **ppTail, struct BSTreeNode *root){ struct BSTreeNode *ltemp, *rtemp; if(root == NULL) { (*ppHead) = NULL; (*ppTail) = NULL; return; } treeToLinkedList(ppHead, &ltemp, root->leftChild); treeToLinkedList(&rtemp, ppTail, root->rightChild); if(*ppHead == NULL) { (*ppHead) = root; root->leftChild = NULL; } else { root->leftChild = ltemp; ltemp->rightChild = root; } if(*ppTail == NULL) { (*ppTail) = root; root->rightChild = NULL; } else { root->rightChild = rtemp; rtemp->leftChild = root; }}

 

样例输入:

10 5 14 45 64 3 7 12 11 33 52 63 23 46 73 44 66 22 45 67 78 83

 

样例输出:

3    5        710            11        12    14                    22                23            33                44        45                    46                52                    63            64                    66                        67                73                    78                        833 5 7 10 11 12 14 22 23 33 44 45 46 52 63 64 66 67 73 78 83 83 78 73 67 66 64 63 52 46 45 44 33 23 22 14 12 11 10 7 5 3

转载地址:http://sayxa.baihongyu.com/

你可能感兴趣的文章
BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)
查看>>
如何提高Ajax性能
查看>>
Android--自定义加载框
查看>>
LINUX下 lamp安装及配置
查看>>
BZOJ3105 [cqoi2013]新Nim游戏
查看>>
困惑的前置操作与后置操作
查看>>
SDNU 1269.整数序列(水题)
查看>>
BZOJ 2118 Dijkstra
查看>>
Go语言基础之结构体
查看>>
SpringCloud:Eureka Client项目搭建(Gradle项目)
查看>>
jqueryValidate
查看>>
ATL使用IE控件,并且屏蔽右键
查看>>
Jenkins
查看>>
linux下使用screen和ping命令对网络质量进行监控
查看>>
数据库设计技巧
查看>>
css定位概述
查看>>
C# 动态修改配置文件 (二)
查看>>
BOM:文档对象模型 --树模型
查看>>
我的Android进阶之旅------>WindowManager.LayoutParams介绍
查看>>
segment
查看>>