数据结构、算法面试系列【1】

来源:互联网 发布:人工智能的原理及应用 编辑:程序博客网 时间:2024/06/03 01:13

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.csdn.net/v_JULY_v 


原创粉丝点击