1、把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
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
};
解题思路:
1、理解二元查找树:
二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二元查找树
2、理解了二元查找树的定义,转换为排序的双向链表就是 中序遍历二元查找树
code:
#include <stdio.h>
#include <iostream>
using namespace std;
//二元查找树节点数据结构
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
BSTreeNode *pHead;//链表头指针
BSTreeNode *pListCur;//链表尾指针
void convertDoubleList(BSTreeNode *pCur);
//创建二元查找树
void addBSTree(BSTreeNode *&pRoot,int value)
{
if(pRoot==NULL)
{
BSTreeNode *pBSTree=new BSTreeNode();
pBSTree->m_pLeft=NULL;
pBSTree->m_pRight=NULL;
pBSTree->m_nValue=value;
pRoot=pBSTree;
}else
{
if((pRoot->m_nValue)>value)
{
addBSTree(pRoot->m_pLeft,value);//插入到左子树
}else if((pRoot->m_nValue)<value)
{
addBSTree(pRoot->m_pRight,value);//插入到右子树
}else
{
//已经存在节点
}
}
}
//中序遍历
void inTraversalBSTree(BSTreeNode * pCur)
{
if(pCur==NULL)
{
return;
}
if( (pCur->m_pLeft) != NULL)
{
inTraversalBSTree(pCur->m_pLeft);
}
convertDoubleList(pCur);//将节点插入链表尾部
if((pCur->m_pRight)!=NULL)
{
inTraversalBSTree(pCur->m_pRight);
}
}
//将节点插入链表尾部
void convertDoubleList(BSTreeNode *pCur)
{
pCur->m_pLeft=pListCur;
if(pListCur!=NULL)
{
pListCur->m_pRight=pCur;
}else
{
pHead=pCur;
}
pListCur=pCur;
cout<<pCur->m_nValue<<endl;
}
int main()
{
pHead=pListCur=NULL;
BSTreeNode *pRoot=NULL;
addBSTree(pRoot,10);
addBSTree(pRoot,4);
addBSTree(pRoot,6);
addBSTree(pRoot,8);
addBSTree(pRoot,12);
addBSTree(pRoot,14);
addBSTree(pRoot,15);
addBSTree(pRoot,16);
inTraversalBSTree(pRoot);
return 0;
}
申明:题目来自http://blog.youkuaiyun.com/v_JULY_v 。