算法-二叉树转双向链表

来源:互联网 发布:逍遥网络加速器 编辑:程序博客网 时间:2024/05/21 13:54

1.首先看二叉树和双向链表的结构体:

双向链表存储结构如下:

typedef struct DulNode{    ElemType    data;    struct DulNode    *prior;    struct DulNode    *next;}

二叉树的二叉链表存储结构如下:

typedef stuct BiTNode{    TElemType    data;    struct  BiTNode    *lchild;    struct  BiTNode    *rchild;}

2.原题:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    
   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};
再来分析题目要求,不能创建任何新的节点,所以我们借助以下语句来实现节点之间的转换
typedef BSTreeNode DoubleList;DoubleList * pHead;DoubleList * pListIndex;

ps:这里是定义而不是创建!

之后就是定义三个功能函数了:

1.创建二元查找树的addBSTreeNode(BSTreeNode * & pCurrent,int value);

2.遍历二元查找树的void ergodicBSTree(BSTreeNode * pCurrent);

3.二叉树转换成list的convertToDoubleList(BSTreeNode * pCurrent);

3.源码:

借用结构之法算法之道博主July写的源码

#include <stdio.h>#include <iostream.h>struct BSTreeNode{    int m_nValue; // value of node    BSTreeNode *m_pLeft; // left child of node    BSTreeNode *m_pRight; // right child of node};typedef BSTreeNode DoubleList;DoubleList * pHead;DoubleList * pListIndex;void convertToDoubleList(BSTreeNode * pCurrent);// 创建二元查找树void addBSTreeNode(BSTreeNode * & pCurrent, int value)//传的是pRoot的地址,所以对pCurrent的操作就是对pRoot的操作{    if (NULL == pCurrent)    {        BSTreeNode * pBSTree = new BSTreeNode();        pBSTree->m_pLeft = NULL;        pBSTree->m_pRight = NULL;        pBSTree->m_nValue = value;        pCurrent = pBSTree;    }    else     {        if ((pCurrent->m_nValue) > value)        {            addBSTreeNode(pCurrent->m_pLeft, value);        }        else if ((pCurrent->m_nValue) < value)        {            addBSTreeNode(pCurrent->m_pRight, value);        }        else        {            //cout<<"重复加入节点"<<endl;        }    }}// 遍历二元查找树  中序void ergodicBSTree(BSTreeNode * pCurrent){    if (NULL == pCurrent)    {                return;    }    if (NULL != pCurrent->m_pLeft)    {        ergodicBSTree(pCurrent->m_pLeft);        }    // 节点接到链表尾部    convertToDoubleList(pCurrent);    // 右子树为空    if (NULL != pCurrent->m_pRight)    {        ergodicBSTree(pCurrent->m_pRight);    }}// 二叉树转换成listvoid  convertToDoubleList(BSTreeNode * pCurrent){    pCurrent->m_pLeft = pListIndex;    if (NULL != pListIndex)    {        pListIndex->m_pRight = pCurrent;    }    else    {        pHead = pCurrent;    }        pListIndex = pCurrent;    cout<<pCurrent->m_nValue<<endl;}int main(){    BSTreeNode * pRoot = NULL;    pListIndex = NULL;    pHead = NULL;    addBSTreeNode(pRoot, 10);    addBSTreeNode(pRoot, 4);    addBSTreeNode(pRoot, 6);    addBSTreeNode(pRoot, 8);    addBSTreeNode(pRoot, 12);    addBSTreeNode(pRoot, 14);    addBSTreeNode(pRoot, 15);    addBSTreeNode(pRoot, 16);    ergodicBSTree(pRoot);    return 0;}

ps:写的不错,July在算法上有非常深的功底,他的博文主页:http://my.csdn.net/v_july_v

原创粉丝点击