搜索与回溯算法 - 1
Q1 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
思路一:利用队列进行操作,层序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
vector<int> elem;
queue<TreeNode*> q;
TreeNode *temp;
if(root)
q.push(root);
else
return elem;
while(!q.empty())
{
temp = q.front();
q.pop();
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
elem.push_back(temp->val);
}
return elem;
}
};
当然二叉树使用递归算法更简洁,但由于函数参数,返回参数等问题,也不多写了。
Q2 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
关于本题,依旧是层序遍历的思路,关键是在于如何识别队列中二叉树每一层的边界,一个比较好的思路是层序遍历时每一次while循环对队列的长度继续统计,之后用for循环来对该层元素进行输出和子女入队列
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> elem;
queue<TreeNode*> q;
TreeNode *temp;
if(root)
q.push(root);
else
return elem;
while(!q.empty() )
{
int n = q.size();
vector<int> tmp;
for(int i=0;i<n;i++)
{
temp = q.front();
q.pop();
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
tmp.push_back(temp->val);
}
elem.push_back(tmp);
}
return elem;
}
};
Q3 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
本题依旧是层序遍历,但需要判断哪一层(可以用上一题的方法区分不同层),若是偶数层,则需要使用栈调整打印顺序
当然,也可以使用双端队列的思想,在奇偶层分别选择插入到队头和队尾
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> elem;
queue<TreeNode*> q;
TreeNode *temp;
int c = 1;
if(root)
q.push(root);
else
return elem;
while(!q.empty() )
{
int n = q.size();
vector<int> tmp;
stack<int> s;
for(int i=0;i<n;i++)
{
temp = q.front();
q.pop();
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);
if(c%2 == 0) //偶数层 先入栈
s.push(temp->val);
else tmp.push_back(temp->val);
}
if (c%2 == 0)
{
for(int j=0;j<n;j++)
{
int a = s.top();
s.pop();
tmp.push_back(a);
}
}
elem.push_back(tmp);
c++;
}
return elem;
}
};