zoukankan      html  css  js  c++  java
  • 二元查找树变双向链表

    声明:取自 ”july“的“微软100题“,加上一些个人理解,欢迎拍砖。

    原文地址:http://blog.csdn.net/v_july_v/article/details/6126406


    学习微软100题笔记:

    1.二元查找树变双向链表:

    #include <stdio.h>
    #include <iostream>


    struct BSTreeNode
    {
        int m_nValue; 
        BSTreeNode *m_pLeft; 
        BSTreeNode *m_pRight; 
    };


    typedef BSTreeNode DoubleList;
    DoubleList * pHead;
    DoubleList * pListIndex;


    void convertToDoubleList(BSTreeNode * pCurrent);


    BSTreeNode* addBSTreeNode(BSTreeNode * & pCurrent, int value)
    {
        if (NULL == pCurrent)
        {
            pCurrent = new BSTreeNode();
            pCurrent->m_pLeft = NULL;
            pCurrent->m_pRight = NULL;
            pCurrent->m_nValue = value;
        }
        else if( pCurrent->m_nValue > value )
        {
            pCurrent->m_pLeft = addBSTreeNode( pCurrent->m_pLeft, value );
    }
    else if ( pCurrent->m_nValue< value )
    {
            pCurrent->m_pRight = addBSTreeNode(pCurrent->m_pRight, value);
    }   
    else
        {
    std::cout<<"重复加入节点"<< std::endl;
        }


    return pCurrent;
    }

    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 );
    }

    }



    void convertToDoubleList( BSTreeNode *pCurrent )
    {
    pCurrent->m_pLeft = pListIndex;
    if( NULL != pListIndex )
    {
    pListIndex->m_pRight = pCurrent;
    }
    else
    {
    pHead = pCurrent;
    }


    pListIndex = pCurrent;


    std::cout << pCurrent->m_nValue << std::endl;
    }


    int
    main( void )
    {
    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;
    }


    其中建立二叉树时是按照 c语言程序设计中(K&R)方法建立的,大同小异。

    重点是利用递归转换为链表的过程。

    一个全局指针pListIndex指向pCurrent的前一个节点,每次调用convertToDoubleList完成

    pCurrent->m_pRight -> pListIndex;因为这里pCurrent不为NULL,然后再pListIndex->m_pLift 指向当前pCurrent

    要先判断pListIndex是否为NULL,因为pListIndex开始时是赋值为NULL的,不能进行解引用操作。




    新手没经验,欢迎指正错误,待更新。详细请见开头原博文 ,july大神。

  • 相关阅读:
    交换变量方法总结
    Java Object Model(一)
    Git命令文本手册
    移动端浏览器touch事件的研究总结
    jQuery中的end()方法
    AngularJs开发——控制器间的通信
    网站收藏
    HTTP Content-type 对照表
    ViewData和ViewBag的那些事
    jQuery选择器
  • 原文地址:https://www.cnblogs.com/newbeeyu/p/5290723.html
Copyright © 2011-2022 走看看