100题_01 把二元查找树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树
10 /   \ 6     14 / \    / \ 4 8 12 16 转换成双向链表4=6=8=10=12=14=16。   分析:可以采用递归的思想,先将左子树转成双向列表,再将右子树转成双向列表,最后将这两个双向列表及根结点组首尾相接,组合成一个双向列表。   以下是实现的代码: BSTreeNode.h
View Code
#pragma once #include <cstdlib> using namespace std; class BSTree; class BSTreeNode { friend class BSTree; public: BSTreeNode(int data, BSTreeNode *rc = NULL, BSTreeNode *lc = NULL); private: int data; BSTreeNode *rc; BSTreeNode *lc; };
BSTreeNode.cpp
View Code
#include "BSTreeNode.h" BSTreeNode::BSTreeNode(int data, BSTreeNode *rc, BSTreeNode *lc) { this->data = data; this->lc = lc; this->rc = rc; }
BSTree.h
View Code
#pragma once #include "BSTreeNode.h" class BSTree { public: BSTree(void); ~BSTree(void); void insert(int data); void convertToDoubleList(); private: BSTreeNode* root; void del(BSTreeNode* node); BSTreeNode* convertToDoubleList(BSTreeNode *&node); };
BSTree.cpp
复制代码
View Code
#include "BSTree.h" #include <cstdlib> using namespace std; BSTree::BSTree(void) { root = NULL; } void BSTree::insert(int data) { if (root == NULL) { root = new BSTreeNode(data); } else { BSTreeNode *cur, *pre; pre = NULL; cur = root; while (true) { pre = cur; if (cur->data <= data) { cur = cur->rc; if (!cur) { pre->rc = new BSTreeNode(data); break; } } else { cur = cur->lc; if (!cur) { pre->lc = new BSTreeNode(data); break; } } } } } BSTree::~BSTree(void) { } void BSTree::del(BSTreeNode *node) { if (node == NULL) return; del(node->lc); del(node->rc); delete node; root = NULL; } BSTreeNode* BSTree::convertToDoubleList(BSTreeNode*& node) { if (node == NULL) return NULL; BSTreeNode *lf, *lt, *rf, *rt, *f, *t; lf = node->lc; rf = node->rc; lt = convertToDoubleList(lf); rt = convertToDoubleList(rf); if (lt != NULL) { lt->rc = node; f = lf; } else= node; node->lc = lt; node->rc = rf; if (rf != NULL) { rf->lc = node; t = rt; } else= node; node = f; return t; } void BSTree::convertToDoubleList() { convertToDoubleList(root); }
复制代码
main.cpp
View Code
#include <iostream> #include "BSTree.h" using namespace std; int main() { BSTree tr; tr.insert(10); tr.insert(7); tr.insert(8); tr.insert(52); tr.convertToDoubleList(); return 0; }
 

posted on   小橋流水  阅读(155)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2010-02-28 2010年目标
2009-02-28 邮箱网盘批量版发布

导航

统计

点击右上角即可分享
微信分享提示