[經典面試題]二叉樹寬度,二叉樹寬度
(1)二叉樹最大寬度
/*--------------------------------------------- * 日期:2015-03-07 * 作者:SJF0115 * 題目: 二叉樹的最大寬度 * 來源:經典面試題 * 部落格: -----------------------------------------------*/ #include <iostream> #include <queue> using namespace std; struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; // 二叉樹的最大寬度 int MaxWidthBinaryTree(TreeNode *root){ if(root == NULL){ return 0; }//if // 當前層 queue<TreeNode*> curLevel; // 下一層 queue<TreeNode*> nextLevel; // 最大寬度 int max = 0; // 當前層寬度 int width = 0; // 排入佇列 curLevel.push(root); TreeNode *node; while(!curLevel.empty()){ width = 0; while(!curLevel.empty()){ ++width; if(width > max){ max = width; }//if node = curLevel.front(); curLevel.pop(); // 左子樹 if(node->left != NULL){ nextLevel.push(node->left); }//if // 右子樹 if(node->right != NULL){ nextLevel.push(node->right); }//if }//while swap(curLevel,nextLevel); }//while return max; } //按先序序列建立二叉樹 int CreateBTree(TreeNode*& T){ int data; //按先序次序輸入二叉樹中結點的值,-1表示空樹 cin>>data; if(data == -1){ T = NULL; } else{ T = new TreeNode(data); //構造左子樹 CreateBTree(T->left); //構造右子樹 CreateBTree(T->right); } return 0; } int main() { TreeNode *root = NULL; CreateBTree(root); int result = MaxWidthBinaryTree(root); cout<<result<<endl; return 0; }
(2)二叉樹各層寬度
/*--------------------------------------------- * 日期:2015-03-07 * 作者:SJF0115 * 題目: 二叉樹的最大寬度 * 來源:經典面試題 * 部落格: -----------------------------------------------*/ #include <iostream> #include <queue> #include <vector> using namespace std; struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; // 二叉樹寬度 vector<int> WidthBinaryTree(TreeNode *root){ vector<int> level; if(root == NULL){ return level; }//if // 當前層 queue<TreeNode*> curLevel; // 下一層 queue<TreeNode*> nextLevel; // 當前層寬度 int width = 0; // 排入佇列 curLevel.push(root); TreeNode *node; while(!curLevel.empty()){ width = 0; while(!curLevel.empty()){ ++width; node = curLevel.front(); curLevel.pop(); // 左子樹 if(node->left != NULL){ nextLevel.push(node->left); }//if // 右子樹 if(node->right != NULL){ nextLevel.push(node->right); }//if }//while level.push_back(width); swap(curLevel,nextLevel); }//while return level; } //按先序序列建立二叉樹 int CreateBTree(TreeNode*& T){ int data; //按先序次序輸入二叉樹中結點的值,-1表示空樹 cin>>data; if(data == -1){ T = NULL; } else{ T = new TreeNode(data); //構造左子樹 CreateBTree(T->left); //構造右子樹 CreateBTree(T->right); } return 0; } int main() { TreeNode *root = NULL; CreateBTree(root); vector<int> result = WidthBinaryTree(root); for(int i = 0;i < result.size();++i){ cout<<"第"<<i+1<<"層->"<<result[i]<<"個節點"<<endl; }//for return 0; }