二叉树的最大深度(DFS,BFS;递归加迭代)

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [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操作来删除容器内的元素。

二叉树的最大深度(DFS,BFS;递归加迭代)_第1张图片

  1. 删除第一个或最后一个元素pop_front 和pop_back 函数—list可以,queue也可以
    pop_front 和pop_back函数用于删除容器内的第一个和最后一个元素。但vector容器类型不支持pop_front操作。这些操作删除指定的元素并返回void;

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;
    }
};

你可能感兴趣的:(二叉树的最大深度(DFS,BFS;递归加迭代))