面试题10 - 二叉搜索树与双向链表 [ 树 ] [Very good!]

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


posted @ 2013-01-21 20:54  小尼人00  阅读(129)  评论(0编辑  收藏  举报