题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中左边二叉搜索树,则输出转换后的排序双向链表。 10 / \ 6 14 / \ / \ 4 8 12 16 4=6=8=10=12=14=16
将二叉搜索树转化为有序双向链表,类似于中序遍历,中序遍历的结果就是一个排序的数字。因此在程序中以中序遍历树,当遍历左子树到在叶子结点的时候,开始修改指针。#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <vector> #include <stack> #include <deque> #include <queue> #include <bitset> #include <list> #include <map> #include <set> #include <iterator> #include <algorithm> #include <functional> #include <utility> #include <sstream> #include <climits> #include <cassert> #define BUG puts("here!!!"); using namespace std; struct Node { int value; Node *lchild, *rchild; }; // 二叉搜索树转变为有序的双向链表 void convert(Node* p, Node* &pLast) { // 中序遍历类似于用 if(p == NULL) return; Node* pCur = p; if(pCur->lchild) { convert(pCur->lchild, pLast); } pCur->lchild = pLast; if(pLast) pLast->rchild = pCur; pLast = pCur; if(pCur->rchild) convert(pCur->rchild, pLast); } Node* solve(Node* root) { Node* pLast = NULL; convert(root, pLast); Node *pHead = pLast; while(pHead && pHead->lchild) pHead = pHead->lchild; return pHead; } int main() { return 0; }