给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
C++
DFS
递归法
/**
* 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:
int maxDepth(TreeNode* root) {
int Lmax=1,Rmax=1;
if(!root){
return 0;
}
Lmax = maxDepth(root->left);
Rmax = maxDepth(root->right);
return Lmax>Rmax?Lmax+1:Rmax+1;
}
};
迭代法(DFS)
/**
* 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:
int maxDepth(TreeNode* root) {
//迭代法,DFS,运用栈的想法;
if(!root){
return 0;
}
stack>s;
TreeNode*p=root;
int maxdeep=0;
int deep = 0;
while(p||!s.empty()){
//一直遍历所有的左节点;
while(p){
s.push(pair(p,deep+1));
p = p->left;
deep++;
}
p = s.top().first;
deep = s.top().second;
maxdeep = max(maxdeep,deep);
s.pop();
p = p->right;
}
return maxdeep;
}
};
迭代法,BFS;这时就需要队列这种数据结构了;
看一下9.5节容器之间的区别—-list类似于链表,容易增删改,queue是两端增删改容易。,所以删除时,用到最多的容器时list
1.删除第一个或最后一个元素—–pop_front 和pop_back 函数,函数返回void
2.删除容器内的一个或一段元素—–erase函数,erase都返回一个迭代器,它指向被删除的元素后面的元素
3.删除容器内所有的元素—clear函数
4. 注意:在删除元素后迭代器会失效,因此一定要对迭代器重新赋值。另外,erase函数返回一个迭代器,指向被删除元素的下一个元素。因为在for语句头中要对迭代器加1,所以在if语句中将迭代器减1,以免漏掉需要处理的元素
一、删除元素—–queue和list容器
前面提到过使用insert操作在容器的任何位置插入元素,并支持特定的push_back和push_front 操作在容器首部或尾部插入新元素。
类似的,容器提供了erase操作和特定的pop_front和pop_back操作来删除容器内的元素。
pop_front 经常与front操作配套使用,实现以栈的方式处理容器
pop_front 和pop_back函数的返回值并不是删除的元素值,而是void。要获取删除的元素值,则必须在删除元素之前调用front或back函数。
这次运用BFS的遍历的方法,运用层次遍历的方法,这样就可以将计算所有的层数,这样还不用比较;
/**
* 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:
int maxDepth(TreeNode* root) {
//迭代法,BFS,运用队列的想法;
//主要是层次遍历,计算有多少层,这样就可以得出最大深度
//还可以不用比较
if(!root){
return 0;
}
queueQ;
TreeNode* p;
Q.push(root);
int deep=0;
while(!Q.empty()){
int widthsize = Q.size();
for(int i=0;ileft){
Q.push(p->left);
}
if(p->right){
Q.push(p->right);
}
}
deep++;
}
return deep;
}
};