输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
解析:等同于将树中序遍历,同时修改每个节点的指针。
下图是一个二叉查找树,中序遍历为5 7 9 19 12 13 14,修改指针后如下图所示的双链表。
为便以统一,加上由于左儿子在跟前面遍历输出,右儿子在跟后面遍历输出,我们先定义两个输出的节点,先遍历输出的是preNode,后遍历输出的curNode,那么preNode的右儿子指针指向curNode,curNode的左儿子指针指向preNode;然后将curNode赋给preNode,curNode等于栈顶的节点。
上程序。
typedef struct Node Tree;
typedef struct Node TreeNode;
struct Node
{
int data;
struct Node * lChild;
struct Node * rChild;
};
void transBSTreeToDLink(Tree * T)
{
TreeNode * preNode =NULL;
TreeNode * curNode = T;
stack<TreeNode *> S;
while (curNode != NULL || !S.empty())
{
while (curNode != NULL)
{
S.push(curNode);
curNode = curNode->lChild;
}
if (!S.empty())
{
curNode = S.top();
if(preNode != NULL)
{
curNode->lChild = preNode;
preNode->rChild = curNode;
preNode = curNode;
}
S.pop();
curNode = curNode->rChild;
}
}
}