二叉树的层次遍历
题目描述: 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
分析:比层次遍历多的约束是按层,不同层的存在一个vector里,采用递归,递归的参数里面带有层数;递归里面解决两个问题,本层(第level层存数),下一层(第level+1)层非空时递归。
void dfs(TreeNode *node, int level)
{
if(node == NULL)
return ;
if(res.size() < level + 1)
res.resize(level + 1);
res[level].push_back(node -> val);
dfs(node -> left, level + 1);
dfs(node -> right, level + 1);
}
求二叉树的层数(高度)
思路:采用层次遍历法,
class Solution {
public:
int maxDepth(TreeNode* root) {
//if(!root) return 0;
//else return 1 + max(maxDepth(root->left),maxDepth(root->right));
if(!root) return 0;
int h = 0;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
h++;//每次遍历一层
int num = q.size();
for(int i=0;i<num;i++){//当前队列的长度为该层的长度,不断pop
TreeNode* node=q.front();
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
q.pop();
}
}
return h;
}
};
树的递归解法,满足条件时终止
思路:在满足条件后返回return并不会停止整个递归过程,实际上递归仍然会继续,解决方法是在判断节点非空时顺便判断一下条件是否满足。
例如,求树的第k个大节点,思路是采用递归方式,每次递归表示访问到一个节点,count++,另外先递归右子树再递归左子树。另外,当count达到k时直接return
void inorder(TreeNode *node, int k)
{
if(node == NULL || count > k)
return ;
inorder(node -> right, k);//先递归右子树
count = count + 1;
// cout << "count" << count << endl;
if(count == k)
{
// cout << "sucess" << endl;
ans = node -> val;
return;
}
inorder(node -> left, k);
}