【LeetCode】102. Binary Tree Level Order Traversal(二叉樹的層級遍歷 完整代碼)

題目如下:

這道題是求二叉樹的層次遍歷,也即寬度優先遍歷,並將結果以二維數組形式輸出。

因爲樹的每一層節點數可能不同,所以採用二維不定長的vector向量儲存

採用遞歸方式求解,找完一層找下一層

輸入在下面的程序前需要處理一下,採用先序建樹,遇到葉子節點時將左右孩子置零,例如題目中的樹,輸入時輸入:

3 9 0 0 20 15 0 0 7 0 0

完整代碼如下: 

#include<bits/stdc++.h>

using namespace std;

vector< vector<int> > result;

typedef struct TreeNode{
	struct TreeNode* left;
	struct TreeNode* right;
	int elem;
};

TreeNode* BinaryTreeCreate() //先序建樹
{
	int x;
	TreeNode *p;
	cin >> x;
	if(x == 0)
	{
		p = NULL;
	} 
	else
	{
		p = (TreeNode*)malloc(sizeof(TreeNode));
		p->left = BinaryTreeCreate();
		p->elem = x;
		p->right = BinaryTreeCreate();
	}
	return p;
}

int DepthOfTree(TreeNode* root) //求樹的深度
{
	if(!root) return 0;
	int leftDepth = DepthOfTree(root->left);
	int rightDepth =  DepthOfTree(root->right);
	return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1;
}



void LevelOrderTraversal(TreeNode* root, int level) //層級遍歷
{

	if(!root) return;
	if(level > DepthOfTree(root)+1) return;
	if(result.size() == level)
        result.push_back(vector<int>());

	result[level].push_back(root->elem); //同一層的存到同一維度
	LevelOrderTraversal(root->left, level+1);
	LevelOrderTraversal(root->right, level+1);
} 

int main()
{
	TreeNode* inorder = BinaryTreeCreate();
	LevelOrderTraversal(inorder, 0);
	for(int i = 0; i < DepthOfTree(inorder); i++)
	{                   
		for(int j = 0; j < result[i].size(); j++)
		{
			cout << result[i][j] << ' ';
		}
		cout<<endl;
	}	
	return 0;
}


 運行結果如下:

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