LeetCode二叉樹構造方法,通過一維數組直接構建完整的二叉樹(按照LeetCode的格式)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章