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

题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
      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


你可能感兴趣的:(C++,数据结构,C++,练手)