1.LeetCode中二叉树的结构
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
以上是Leetcode中二叉树的结构,然而在题目通常会这样给出
那么从输入一个一维数组如何转变成对应的二叉树结构呢,下面给出源码。
2.从一维数组到对应的二叉树结构
#include<iostream>
#include<vector>
using namespace std;
#define null 65535
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x){ //结构体的构造函数
val=x;
left=NULL;
right=NULL;
}
};
TreeNode* CreateTree(vector<int>Data) {
//vector<int>Data = { 1,2,3,null,4,5,6,7,null };
TreeNode* root=NULL;
TreeNode* tmp;
if (Data[0] == null)
return root;
vector<TreeNode*>NodesNow;//用于存储当前层的结点
vector<TreeNode*>FatherNodes;//用于存储上一层的结点
root = new TreeNode(Data[0]);
FatherNodes.push_back(root);
int index = 1;
int MaxNum = FatherNodes.size()*2;//用于存储每一层可以存储的最大结点个数,应该是上一层非空结点的2倍
int SaveNum = 0;//用于记录当前层已经存储了多少结点
bool LRFlag = false;//用于记录下一个上上层结点的左孩子还是右孩子
while (index < Data.size()) {
if (Data[index] == null&& SaveNum < MaxNum)
{
SaveNum++;
index++;
if (index == Data.size()) break;
if (LRFlag) LRFlag = false;
else LRFlag = true;
}
if (SaveNum < MaxNum) {
tmp = new TreeNode(Data[index]);
NodesNow.push_back(tmp);
if (LRFlag)
{
FatherNodes[SaveNum / 2]->right = tmp;
LRFlag = false;
}
else {
FatherNodes[SaveNum / 2]->left = tmp;
LRFlag = true;
}
SaveNum++;
index++;
}
else
{
SaveNum = 0;
MaxNum = NodesNow.size() * 2;
LRFlag = false;
FatherNodes.clear();
for (int i = 0; i < NodesNow.size(); i++)
{
FatherNodes.push_back(NodesNow[i]);
}
NodesNow.clear();
}
}
return root;
}
void prePrint(TreeNode* Root) {//先序遍历
if (Root == NULL) return;
cout << Root->val << ',';
prePrint(Root->left);
prePrint(Root->right);
return;
}
void postPrint(TreeNode* Root) {//后序遍历
if (Root == NULL) return;
postPrint(Root->left);
postPrint(Root->right);
cout << Root->val << ',';
return;
}
void inPrint(TreeNode* Root) {//中序遍历
if (Root == NULL) return;
inPrint(Root->left);
cout << Root->val << ',';
inPrint(Root->right);
return;
}
int main() {
vector<int>Data = { 1,2,3,null,4,5,6,7,null};
TreeNode* Root = NULL;
Root = CreateTree(Data);
cout << "PreOrder:"<< endl;
prePrint(Root);
cout << endl<<"InOrder:" << endl;
inPrint(Root);
cout << endl<<"PostOrder:" << endl;
postPrint(Root);
getchar();
}
3.结果验证
测试使用的是上图 所示的二叉树,对应的一维数组是[1,2,3,null,4,5,6,7,null],得到的结果如下: