- 剑指32a:从上到下打印二叉树
- 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
vector<int> levelOrder(TreeNode* root)
{
// 考察树的层次遍历
vector<int> res;
if(root == null) return res;
queue<TreeNode*> q;
q.push(root->val); // 根节点先入队
while(!q.empty())
{
TreeNode* node = q.top();
q.pop();
res.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
return res;
}
- 剑指32b:从上到下打印二叉树,每行单独打印,这个也是用BFS,只不过每层的节点数在遍历前计个数
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>res;
if(root==NULL)return res;
queue<TreeNode*>q;
q.push(root);
while(!q.empty()){
vector<int>r;
int l=q.size();
for(int i=0;i<l;i++){ //当前层节点都在队列中,依次取出
TreeNode* t=q.front();
r.push_back(t->val);
q.pop();
if(t->left)q.push(t->left);
if(t->right)q.push(t->right);
}
res.push_back(r);
}
return res;
}
- 剑指32c:从上到下之字形打印二叉树,用到双端队列
vector<vector<int>> levelOrder(TreeNode* root){
vector<vector<int>> res;
if(root==NULL) return res;
bool flag = true; // 从左向右打印为true,从右向左打印为false
deque<TreeNode*> q;
q.push_back(root);
TreeNode* t;
while(!q.empty())
{
int l = q.size(); // 当前行pop前,计当前行的节点数
vector<int> tmp;
for(int i = 0; i<l; i++)
{
if(flag) // 第一行(i=0)为奇数层,元素放队列尾部
{
t=q.front();
q.pop_front();
tmp.push_back(t->val);
if(t->left) q.push_back(t->left);
if(t->right) q.push_back(t->right);
}
else // 第二行,偶数层,元素放队列头部
{
t = q.back();
q.pop_back();
tmp.push_back(t->val);
if(t->right) q.push_front(t->right);
if(t->left) q.push_front(t->left);
}
}
flag = !flag;
res.push_back(tmp);
}
return res;
}
剑指 Offer 54. 二叉搜索树的第k大节点
主要思想:
- 中序遍历的倒序为递减序列
- 二叉搜索树第 k大的节点”可转化为求 “此树的中序遍历倒序的第 k 个节点
为求第 kk个节点,需要实现以下 三项工作 :
- 递归遍历时计数,统计当前节点的序号;
- 递归到第 kk 个节点时,应记录结果 res;
- 记录结果后,后续的遍历即失去意义,应提前终止
int kthLargest(TreeNode* root, int k){
return dfs(root, k);
}
int dfs(TreeNode* root int& k){
if(root==null) return;
// 中序遍历的倒序
dfs(root->right, k);
k--;
if(k==0) return root->val;
def(root->left, k);
}