算法练习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
结论
- 很久没写算法,有思路但会卡壳,脑子还是要多用用
- TreeNode* ConstructTree(const std::vector
& in)接口改成ConstructTree(const std::vector & in,TreeNode** root)会有问题,有空探索一下
浙公网安备 33010602011771号