版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qilei2010/article/details/51383679
最近做二叉树的题目,写完代码想在本地编译运行,结果一时半会想不起树如何构造。而网上竟然也没有类似代码,于是自己写了个。
约定:二叉树采用宽度优先遍历来数组化,二叉树的节点按照BFS的顺序依次存储在数组内,数组中的’#’代表空节点,末尾的’#’可省略。
如:
1
/ \
2 3
/ \ \
4 5 6
/ \
7 8
这棵树会被序列化为:{1,2,3,4,5,#,6,#,#,7,8},后面的四个#被省略。
7
/ \
2 8
/ \ \
1 6 10
/ / \
3 9 11
\
5
/
4
//数组应该为{7,2,8,1,6,#,10,#,#,3,#,#,#,9,11,#,#,#,#,#,5,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,4}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//二叉树的节点定义
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int val) {
this->val = val;
this->left = this->right = NULL;
}
};
//从数组的某个位置的元素开始生成树
TreeNode* createTree(vector<int> list, int start){
if (list[start] == '#') {
return NULL;
}
TreeNode* root = new TreeNode(list[start]);
int lnode = 2*start + 1;
int rnode = 2*start + 2;
if ( lnode > list.size() -1) {
root -> left = NULL;
}else{
root -> left = createTree(list, lnode);
}
if (rnode > list.size() -1) {
root -> right =NULL;
}else{
root -> right = createTree(list, rnode);
}
return root;
}
//先序遍历函数
void PreOrderTraverse(TreeNode *T)
{
if(T)
{
cout<<T->val<<" ";
PreOrderTraverse(T->left);
PreOrderTraverse(T->right);
}
return;
}
int main()
{
vector<int> datanum = {1,2,3,4,5,'#',6,'#','#',7,8};
//1,2,3,4,5,'#',6,'#','#',7,8,'#','#','#','#' 后面的#可省略
TreeNode *t;
t = createTree(datanum, 0);
printf("The pre order is : ");
PreOrderTraverse(t);
//下面就可以用构造出的树做测试了
return 0;
}