您的位置:首页 > 其它

把二元查找树转变成排序的双向链表

2015-05-13 21:34 381 查看
题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

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 child of node

BSTreeNode *m_pRight; // right child of node

};

解答

下面是具体函数的实现(java 敲多了 格式有点偏java)

BSTreeNode* LeftMax(BSTreeNode *Node){                        //获得当前节点左边树中最大值
if(Node->m_pRight != NULL){
return LeftMax(Node->m_pRight);
}else{
return Node;
}
}

BSTreeNode* RightMin(BSTreeNode *Node){                      //获得当前节点右边树中最小值
if(Node->m_pLeft != NULL){
return RightMin(Node->m_pLeft);
}else{
return Node;
}
}

void Deal(BSTreeNode *Node){										//具体的处理函数
if(Node->m_pLeft != NULL){
Deal(Node->m_pLeft);
Node->m_pLeft = LeftMax(Node->m_pLeft);                       //当前节点的左孩子指向 左边树下的最大的那个节点
Node->m_pLeft->m_pRight = Node;	                              // 左边树下的最大的那个节点 的右孩子指向 当前节点
}

if(Node->m_pRight != NULL){
Deal(Node->m_pRight);
Node->m_pRight = RightMin(Node->m_pRight);                   //当前节点的右孩子指向 右边树下的最小的那个节点
Node->m_pRight->m_pLeft = Node;                              // 右边树下的最小的那个节点 的左孩子指向 当前节点
}
}


整个代码下载地址:http://download.csdn.net/detail/u010862116/8700639
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: