将一颗搜索树转换成一个排序的双向链表。要求不能创建任何新的节点
来源:互联网 发布:北京医疗软件开发商 编辑:程序博客网 时间:2024/06/07 00:36
思路:
在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链表,只是因为两个指针的指向不同而已,通过改变其指针的指向来实现是完全可能的。
为了减少指针的变换次数,并让操作更加简单,在转换成排序双向链表时,原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向下一个结点的指针。由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。同时中序遍历过程正好是转换成链表的过程,可采用递归方法处理。
完整代码及测试
typedef struct BinartTree{ int _value; BinartTree* _left; BinartTree* _right;}Node;//构建二叉树Node* CreateBinaryTree(int value){ Node* root = new Node(); root->_value = value; root->_left = NULL; root->_right = NULL; return root;}//构建树的左右节点void ConnectTreeNode(Node* parent, Node* pleft, Node* pright){ if (parent != NULL) { parent->_left = pleft; parent->_right = pright; }}//中序遍历树节点void InOrder(Node* root){ if (root == NULL) cout<<"this is empty Node"; if (root->_left) { InOrder(root->_left); } cout << root->_value<<" "; if (root->_right) { InOrder(root->_right); }}//转换搜索二叉树为双向链表void BinaryTreeToList(Node* root, Node** listNode){ if (root == NULL) return; Node* pcur = root; if (root->_left) { BinaryTreeToList(root->_left,listNode); } pcur->_left = *listNode; if (*listNode) { (*listNode)->_right = pcur; } *listNode = pcur; if (root->_right) { BinaryTreeToList(root->_right, listNode); }}//获取双向链表的头Node* ListHead(Node* proot){ Node* listNode = NULL; BinaryTreeToList(proot, &listNode); Node* pHead = listNode; while (pHead && pHead->_left) { pHead = pHead->_left; } return pHead;}//打印双向链表void Print(Node* pHead){ Node* cur = pHead; while (cur) { cout << cur->_value << " "; cur = cur->_right; } cout << endl;}void test(){ Node* n10 = CreateBinaryTree(10); Node* n6 = CreateBinaryTree(6); Node* n14 = CreateBinaryTree(14); Node* n4 = CreateBinaryTree(4); Node* n8 = CreateBinaryTree(8); Node* n12 = CreateBinaryTree(12); Node* n16 = CreateBinaryTree(16); ConnectTreeNode(n10, n6, n14); ConnectTreeNode(n6, n4, n8); ConnectTreeNode(n14, n12, n16); InOrder(n10); cout << endl; Node* pHead = ListHead(n10); Print(pHead);}
阅读全文
0 0
- 将一颗搜索树转换成一个排序的双向链表。要求不能创建任何新的节点
- 题目:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
- java 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
- (Java实现)输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向
- 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 牛客原题 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
- 二元查找树转化成排序的双向链表——要求不创建新的节点
- 【剑指offer】二叉搜索树转换为有序双向链表。要求不创建新节点。只改变指向。
- 二叉搜索树->双向有序链表,不能产生新的节点。
- 【面试题】剑指offer27--将一颗二叉搜索树转换成一个排序的双向链表
- 【二叉树】将二叉搜索树转换成一个排序的双向链表
- 二叉树--将二叉搜索树转换成一个排序的双向链表
- 牛客网-二叉搜索树转换成一个排序的双向链表
- 剑指offer27---将二叉搜索树转换成一个排序的双向链表
- 二叉搜索树转换成一个排序的双向链表
- 变量,数据类型及转换
- [LeetCode] 542. 01 Matrix
- [UML]类之间的关系
- Android酷炫实用的开源框架(UI框架)
- iOS-Core-Animation-Advanced-Techniques笔记
- 将一颗搜索树转换成一个排序的双向链表。要求不能创建任何新的节点
- SoapUI接口测试--使用EXCEL参数化
- 绘制饼状图
- UVa514-Rails-铁轨--栈的使用
- 浅析MySQL中concat以及group_concat的使用
- pom.xml 配置主要是maven的配置
- 高精度减法
- JQ设置cookie、读取cookie、删除cookie2
- 指针和引用与*操作符和&操作符