将二叉查找树转化为链表的代码实现

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


根据提供的思路,我自己写了一个读入任意序列的整数,建立二叉查找树再改成链表的C++代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

// binary search tree node
struct BSTreeNode
{
    int value;
    struct BSTreeNode *leftChild;
    struct BSTreeNode *rightChild;
};

void addBSTreeNode(struct BSTreeNode **ppRoot/*double pointer to the root*/, int new_value);
void printBSTree(ofstream *fout, struct BSTreeNode *root, int level);
void treeToLinkedList(struct BSTreeNode **ppHead, struct BSTreeNode **ppTail, struct BSTreeNode *root);

int main() {
    ifstream fin ("tree_to_linked_list.in");
    ofstream fout ("tree_to_linked_list.out");
    int in;
    struct BSTreeNode *root = NULL, *head = NULL, *tail = NULL, *node = NULL;

    if(fin.good() == false)
    {
        cerr << "file open failed" << endl;
        return 0;
    }

    while(true)
    {
        if(fin.eof())
            break;

        fin >> in;

        addBSTreeNode(&root, in);
    }

    printBSTree(&fout, root, 0);

    fout << endl;

    treeToLinkedList(&head, &tail, root);

    for(node = head; node != NULL; node = node->rightChild)
    {
        fout << node->value << " ";
    }
    fout << endl;

    for(node = tail; node != NULL; node = node->leftChild)
    {
        fout << node->value << " ";
    }
    fout << endl;

    return 0;
}

void addBSTreeNode(struct BSTreeNode **ppRoot/*double pointer to the root*/, int new_value)
{
    if(*ppRoot == NULL)
    {
        *ppRoot = new struct BSTreeNode();
        (*ppRoot)->value = new_value;
        
        return;
    }

    if(new_value == (*ppRoot)->value)
    {
        return;
    }
    else if(new_value < (*ppRoot)->value)
    {
        addBSTreeNode(&(*ppRoot)->leftChild, new_value);
    }
    else
    {
        addBSTreeNode(&(*ppRoot)->rightChild, new_value);
    }
}

void printBSTree(ofstream *pFout, struct BSTreeNode *root, int level)
{
    if(root == NULL)
        return;

    printBSTree(pFout, root->leftChild, level + 1);

    int i;

    for(i = 0; i < level; i ++)
        (*pFout) << "\t";

    (*pFout) << root->value << endl;

    printBSTree(pFout, root->rightChild, level + 1);
}

void treeToLinkedList(struct BSTreeNode **ppHead, struct BSTreeNode **ppTail, struct BSTreeNode *root)
{
    struct BSTreeNode *ltemp, *rtemp;

    if(root == NULL)
    {
        (*ppHead) = NULL;
        (*ppTail) = NULL;
        return;
    }

    treeToLinkedList(ppHead, &ltemp, root->leftChild);
    treeToLinkedList(&rtemp, ppTail, root->rightChild);

    if(*ppHead == NULL)
    {
        (*ppHead) = root;
        root->leftChild = NULL;
    }
    else
    {
        root->leftChild = ltemp;
        ltemp->rightChild = root;
    }

    if(*ppTail == NULL)
    {
        (*ppTail) = root;
        root->rightChild = NULL;
    }
    else
    {
        root->rightChild = rtemp;
        rtemp->leftChild = root;
    }
}

 

样例输入:

10 5 14 45 64 3 7 12 11 33 52 63 23 46 73 44 66 22 45 67 78 83

 

样例输出:

        3
    5
        7
10
            11
        12
    14
                    22
                23
            33
                44
        45
                    46
                52
                    63
            64
                    66
                        67
                73
                    78
                        83

3 5 7 10 11 12 14 22 23 33 44 45 46 52 63 64 66 67 73 78 83 
83 78 73 67 66 64 63 52 46 45 44 33 23 22 14 12 11 10 7 5 3 




____________________________
本博客文章主要供博主学习交流用,所有描述、代码无法保证准确性,如有问题可以留言共同讨论。
原文地址:https://www.cnblogs.com/waytofall/p/2439090.html