问题描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路
其实考察的是对二叉树的层次遍历
通过队列实现,首先判断树是否为空,不为空时根节点首先进入队列。
当队列不为空时,队首元素出队,如果队首元素有左孩子,其左孩子进队列。
接着判断队首元素是否有右孩子,有的话右孩子进队列。
一直重复上诉操作直到队空。
实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> levelTraverse;
if(root==NULL){
return levelTraverse;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* front=q.front();
q.pop();
if(front->left){
q.push(front->left);
}
if(front->right){
q.push(front->right);
}
levelTraverse.push_back(front->val);
}
return levelTraverse;
}
};
问题描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
递归实现方法
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
int deep=0;
int left,right;
if(pRoot==NULL){
return deep;
}
left=TreeDepth(pRoot->left);
right=TreeDepth(pRoot->right);
deep=1+(left>right?left:right);
return deep;
}
};
非递归实现方法,使用层次遍历
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(pRoot==NULL){
return 0;
}
queue<TreeNode*> q;
int deep=0;
int count=0;
q.push(pRoot);
int curLayerCount=q.size();
while(q.size()!=0){
TreeNode* front=q.front();
q.pop();
count++;
if(front->left){
q.push(front->left);
}
if(front->right){
q.push(front->right);
}
if(count==curLayerCount){
count=0;
deep++;
curLayerCount=q.size();
}
}
return deep;
}
};