把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left childof node
BSTreeNode *m_pRight; // rightchild of node
};
分析:
首先要明白什么是二元查找树
二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二元查找树简单的说就是:左节点 < 根节点 < 右节点 (所有子树也满足该条件)
我们就可以选择中序遍历(也叫中根遍历,可记做左根右)
什么是双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点
中序遍历二叉查找树,因此结点按从小到大顺序访问,假设之前访问过的结点已经调整为一个双向链表,那么只需要将当前结点连接至双向链表的最后一个结点即可,访问完后,双向链表也就调整完了。
二元查找树的结点已给出,它的左指针和右指针正好做为双向链表的前驱指针和后驱指针
题目分析清楚了,那代码就好写了。分三步
1、建立二叉查找树
2、中序遍历并调整结点指针
3、调整结点指针
具体参考:http://www.cnblogs.com/caidaxia/archive/2011/10/14/2212369.html