问题描述:
输入一个二叉搜索树,将该二叉树转化成一个排序的双向链表。要求不能创建任何新的节点,只能够调整树中节点指针的指向。
二叉树的节点定义如下:
struct Node{
int value;
Node * left;
Node * right;
};
由于该树是二叉排序树,所以每个根节点的左指针指向的是其左子树的最右下角的节点,右指针指向的应当是其右子树的最左下的节点。
基于以上结论,我们可以写出如下的代码:
struct Node {
int val;
Node * left;
Node * right;
};
Node * convertTree(Node * RootofTree){
Node * lastNodeinList=NULL;
convertTree(RootofTree,lastNodeinList);
while(lastNodeinList->left!=NULL&&lastNodeinList!=NULL){
lastNodeinList=lastNodeinList->left;
}
return lastNodeinList;
}
Node * convertTree(Node * RootofTree, Node * lastNodeinList){
if(RootofTree=NULL){
return;
}
Node * currentp=RootofTree;
if(currentp->left!=NULL){//类似于中序遍历的先访问左子树
convertTree(currentp->left,lastNodeinList);
}
/****************///类似于中序遍历的访问当前节点
currentp->left=lastNodeinList;
if(lastNodeinList!=NULL){
lastNodeinList->right=currentp;
}
lastNodeinList=currentp;
/*****************/
if(currentp->right!=NULL){//类似于中序遍历的访问右子树
convertTree(currentp->right,lastNodeinList);
}
}