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],得到的結果如下: