在构造二叉树的时候常见的是使用cin >> node_value; 来确定树的节点值,这就造成了我们调试程序每次都得手动输入一棵树的已知遍历,,极不方便,且效率低下,假如我们将这个遍历定义为一个数组,就可以省去这些麻烦啦,请看下面的例程。
已知上面树的前序遍历,,我们可以由前序遍历构造二叉树,,代码如下:(运行环境:DEV C++ 5.11)
#include<bits/stdc++.h>
using namespace std;
const int END = 0xFFFFFFFF;// 表示无子节点了,树枝到此结束
struct TreeNode{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
// 构造二叉树
TreeNode* DLR_bulid_tree(vector<int> data, int& start)
{
TreeNode* root = nullptr;
if(data.size() <= 0 || start < 0) // 参数异常检测
return root;
if(data[start] != END)
{
root = new TreeNode(0);
root->val = data[start++];
root->left = DLR_bulid_tree(data, start);
start++;
root->right = DLR_bulid_tree(data, start);
}
return root;
}
// 前序遍历输出
void previse_order(TreeNode* T)
{
if(T)
{
printf("%d ",T->val);
previse_order(T->left);
previse_order(T->right);
}
}
int main()
{
// 此处为前序遍历(满二叉树的前序遍历形式)END表示结束无子节点,可以用-1标记
vector<int> data{1,2,4,END,END,5,7,END,END,END,3,END,6,END,END};
int start = 0;
TreeNode* tree = DLR_bulid_tree(data, start);// star为从data中何处开始建树
cout << "构建树的前序遍历为:\n";
previse_order(tree);
return 0;
}
欢迎大家加C/C++ Linux 技术栈开发群:786177639,一起交流学习。