题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中左边二叉搜索树,则输出转换后的排序双向链表。
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;
}