算法练习1-输入整型数组存入二叉树并输出中序遍历结果

任务分解

1)接收用户输入整数存入到vector中
2)把vector中数据转化为一个树
3)中序遍历树

结果代码

//a2.cpp
#include <QCoreApplication>

#include <iostream>
#include <queue>

using namespace std;
typedef struct stTreeNode
{
    int value = -1;
    stTreeNode *pleft = nullptr;
    stTreeNode *pright = nullptr;
} TreeNode;
void PrintInMedianOrd(TreeNode *root);

void ReadValueFromStdIn(std::vector<int> & out)
{
    int num = -1;
    std::cout << "please input a num, end with -1\n";
    while(std::cin>>num)
    {
        out.push_back(num);
    }
    std::cout << "input size " << out.size();
}

TreeNode* ConstructTree(const std::vector<int> & in)
{
    std::queue<TreeNode* > temp_queue;
    TreeNode* parent = new TreeNode;
    if(in.size() > 0)
    {
        parent->value = in[0];
    }  else
    {
        delete parent;
        return nullptr;
    }
    int cur_pos = 1;
    temp_queue.push(parent);
    while(cur_pos < in.size())
    {
        std::cout<< "\n=============\n";
        TreeNode* TopNode = temp_queue.front();
        std::cout<< "topNode value" << TopNode->value << ","<<TopNode<<std::endl;
//        std::cout<< "cur_pos " << cur_pos << std::endl;
        auto cur_value = in[cur_pos];
        TreeNode* leftNode = new TreeNode{cur_value};
        std::cout<< "leftNode value " << leftNode->value << ","<<leftNode << std::endl;
        temp_queue.push(leftNode);

        TopNode->pleft = leftNode;
        ++cur_pos;
        if(cur_pos < in.size())
        {
            cur_value = in[cur_pos];
            TreeNode* rightNode = new TreeNode{cur_value};
            std::cout<< "rightNode value " << rightNode->value << ","<<rightNode << std::endl;
            temp_queue.push(rightNode);
            TopNode->pright = rightNode;
        }
        ++cur_pos;
        temp_queue.pop();
    }
    std::cout<<"root addr" << parent<< ","<<std::endl;
//    PrintInMedianOrd(parent);
    return parent;
}

void PrintInMedianOrd(TreeNode *root)
{
    if(root!=nullptr)
    {
        PrintInMedianOrd(root->pleft);
        PrintInMedianOrd(root->pright);
        std::cout<< "final value: "<< "," << root->value << root << ","<< root->pleft <<","<< root->pright <<std::endl;
    }
}

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);
    std::cout << "Hello, tree example " << "!\n";
    TreeNode *parent1 = nullptr;
    std::vector<int> numInput;
    ReadValueFromStdIn(numInput);
    std::cout<<"\ninpt data is:";
    for(auto num : numInput)
        std::cout<< num << " ";
    std::cout<< "\n构建树:\n";

    parent1 = ConstructTree(numInput);
    std::cout<<"construct addr" << parent1<<std::endl;
    PrintInMedianOrd(parent1);
    return a.exec();
}

对应的pro文件

QT       += core
QT -= gui
CONFIG += console

TARGET = testprograme
TEMPLATE = app

SOURCES += \
        a2.cpp

运行结果

D:\**\debug>testprograme.exe
Hello, tree example !
please input a num, end with -1
1
2
3
4
5
6
c
input size 6
inpt data is:1 2 3 4 5 6
构建树:

=============
topNode value1,00B7F6C0
leftNode value 2,00B7F618
rightNode value 3,00B7F1B8

=============
topNode value2,00B7F618
leftNode value 4,00B7F490
rightNode value 5,00B7F688

=============
topNode value3,00B7F1B8
leftNode value 6,00B7F068
root addr00B7F6C0,
final value: ,400B7F490,00000000,00000000
final value: ,500B7F688,00000000,00000000
final value: ,200B7F618,00B7F490,00B7F688
final value: ,600B7F068,00000000,00000000
final value: ,300B7F1B8,00B7F068,00000000
final value: ,100B7F6C0,00B7F618,00B7F1B8

结论

  1. 很久没写算法,有思路但会卡壳,脑子还是要多用用
  2. TreeNode* ConstructTree(const std::vector & in)接口改成ConstructTree(const std::vector & in,TreeNode** root)会有问题,有空探索一下
posted @ 2023-06-15 00:12  大有神的自我独白  阅读(26)  评论(0)    收藏  举报