[LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS

2023-11-07

目录:
1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS
2.Binary Tree Level Order Traversal II - 二叉树层次遍历从低往高输出 BFS
3.Maximum Depth of Binary Tree - 求二叉树的深度 DFS
4.Balanced Binary Tree - 判断平衡二叉树 DFS
5.Path Sum - 二叉树路径求和判断DFS


题目概述:
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

Here's an example:

   1
  / \
 2   3
    /
   4
    \
     5
The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}".


题目分析:
        本题考查的就是二叉树的层次遍历,需要注意的是二叉树用数组的表示方法,二叉树的每层是从左到右存入数组的。方法包括:
        1.层次遍历。二维数组存储数字和深度,输出二维数组即可,过于复杂。
        2.通过队列BFS广度优先搜索。
        3.通过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:
    //二叉树层次遍历 通过队列BFS广度优先搜索
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        queue<TreeNode*>q;            
        vector<int> level;       //每层结果
        int size,i;
        TreeNode* p;
        
        if(root==NULL) return result;
        q.push(root);            //入队
        while(!q.empty()) {
            //队列中有几个元素就依次遍历每个元素的左右结点
            level.clear();
            size=q.size();
            for(i=0; i<size; i++) {
                p=q.front();     //队首元素值赋给p
                q.pop();         //出队
                level.push_back(p->val);
                if(p->left) {    //依次压入左右结点元素
                    q.push(p->left);
                }
                if(p->right) {
                    q.push(p->right);
                }
            }
            result.push_back(level);   //添加每层数据
        }
        return result;
    }
};


代码详解:
        该题目你如果采用C语言二维数组过于复杂,故采用C++的容器vector实现。同时BFS广度优先搜索采用队列queue实现,常见方法如下(参考地址):
        1.栈操作

#include<stack>         头文件
stack<int> s            定义栈
s.empty()               如果栈为空返回true,否则返回false  
s.size()                返回栈中元素的个数  
s.pop()                 删除栈顶元素但不返回其值  
s.top()                 返回栈顶的元素,但不删除该元素  
s.push()                在栈顶压入新元素  
        2.队列操作
#include<queue>         头文件
queue<int> q            定义队列
q.empty()               如果队列为空返回true,否则返回false  
q.size()                返回队列中元素的个数  
q.pop()                 删除队列首元素但不返回其值  
q.front()               返回队首元素的值,但不删除该元素  
q.push()                在队尾压入新元素  
q.back()                返回队列尾元素的值,但不删除该元素  
        3.二叉树层次遍历如何使用队列
        由于二叉树是从左至右进行输入,故层次遍历通过队列存储每层的结点,它存储的顺序也是前一个结点的左孩子结点、右孩子结点,依次顺序进出队列。

        DFS代码参考地址:LeetCode Binary Tree Level Order Traversal


其他题目:
Binary Tree Level Order Traversal II
        层次遍历从低往root结点输出,如 
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

          return its level order traversal as:

[
  [15,7],
  [9,20],
  [3]
]
        最简单方法通过层次遍历BFS调用队列后逆序倒置vector容器即可。
/**
 * 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:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> result;
        vector<int> level;
        queue<TreeNode*> q;
        
        if(root==NULL)
            return result;
        q.push(root);
        while(!q.empty()) {
            //层次遍历
            level.clear();
            int size=q.size();
            for(int i=0; i<size; i++) { //注意:不能i<q.size() 当入队时它会变换
                TreeNode* p=q.front();
                q.pop();
                level.push_back(p->val);
                if(p->left)
                    q.push(p->left);
                if(p->right)
                    q.push(p->right);
            }
            //每层结果存入容器
            result.push_back(level);
        }
        /*
         * 逆序输出 倒置容器调用函数
         * reverse(result.begin(),result.end());
         * return result;
         */
        vector<vector<int>>::iterator iter;  //迭代器
        vector<vector<int>> res;
        for(iter=result.end()-1; iter!=result.begin()-1; iter--)
        {
            level.clear();
            for(int i=0; i<(*iter).size(); i++) //复制每层内容
            {
                level.push_back((*iter)[i]);
            }
            res.push_back(level);
        }
        return res;
    }
};
        PS:如果是每层的也要逆序的话,就把left 和right 入队的顺序调换一下。另一种遍历方法参考:http://www.cnblogs.com/ganganloveu/p/3843470.html
        


Maximum Depth of Binary Tree - 求二叉树的深度
        常见方法通过BFS层次遍历计算二叉树层数及深度或通过DFS计算二叉树从root到leaf结点最长路径及深度,在采用BSF代码中可通过前面代码进行修改,但错误:
                        [0,2,4,1,null,3,-1,5,1,null,6,null,8] output=5 Excepted=4
        故采用DFS进行深度递归搜索。代码如下:
int maxDepth(struct TreeNode* root) {
    if(root == NULL) return 0;
    int left = maxDepth(root->left);
    int right = maxDepth(root->right);
    return (left >= right ? left : right) + 1;
}
        BFS代码参考:http://blog.csdn.net/sunbaigui/article/details/8980887



Balanced Binary Tree - 判断平衡二叉树
        平衡二叉树是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。参考前面的计算深度方法完成。

 int DFS(struct TreeNode* p) {
    if(p==NULL)
        return 0;
    int left=DFS(p->left);
    int right=DFS(p->right);
    return (left>=right?left:right)+1;
 }
//递归判断左右子树结点是否符合平衡二叉树
bool isBalancedNode(struct TreeNode* L,struct TreeNode* R) {
    if(!L&&!R) 
        return true;
    //自定义DFS函数计算结点的深度
    int left=DFS(L);
    int right=DFS(R);
    //平衡二叉树左右结点深度相差0或1
    if(abs(left-right)>1) 
        return false;
    else if(L&&R) //必须存在 否则会报错RE [1,2]时R->left不存在
        return isBalancedNode(L->left,L->right) && isBalancedNode(R->left,R->right);
}
bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
        return true;
    if(root&&!root->left&&!root->right)
        return true;
    else 
        return isBalancedNode(root->left,root->right);
}
        另一种方法参考地址,也可通过后序遍历实现。
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool checkBalance(TreeNode *node, int &dep)
    {
        if (node == NULL)
        {
            dep = 0;
            return true;
        }
        
        int leftDep, rightDep;
        bool leftBalance = checkBalance(node->left, leftDep);
        bool rightBalance = checkBalance(node->right, rightDep);
        
        dep = max(leftDep, rightDep)+1;
        
        return leftBalance && rightBalance && (abs(rightDep - leftDep) <= 1);
    }
    
    bool isBalanced(TreeNode *root) {
        int dep;
        return checkBalance(root, dep);
    }
};



Path Sum - 二叉树路径求和判断

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.For example:
Given the below binary tree and sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

        该题主要考察DFS或BFS计算root到leaf结点路径求和是否存在一条与sum相等的path。我采用DFS结合计算二叉树深度完成,最初打算自定义isNode(*root,num)函数判断,后来直接通过判断每个结点是否是leaf且值为sum-前面结点。代码如下:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

//思路:通过DFS计算root-to-leaf的结果
bool hasPathSum(struct TreeNode* root, int sum) {
    if(root==NULL)
        return false;
    else if(root&&!root->left&&!root->right&&root->val==sum)  //仅root结点
        return true;
    else if(root&&!root->left&&!root->right&&root->val!=sum)
        return false;
    else  //包括子结点
        return hasPathSum(root->left,(sum - root->val)) ||
            hasPathSum(root->right,(sum - root->val));
}



(By:Eastmount 2015-9-11 凌晨3点半   http://blog.csdn.net/eastmount/)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS 的相关文章

  • 【Clion+CubeMX开发STM32】(二)创建自己的工程

    目录 新建工程 修改芯片型号 添加自己的文件 将自己的文件添加Cmake项目 修改CMakeLists template txt 烧录程序 编写 cfg文件 编写 cfg文件 新建工程 打开你的Clion 点击新建工程 在左侧找到STM32
  • 期货开户寻找交易确定性

    1 寻找确定性 都说金融是概率游戏 大家都是说胜率有多少 没有谁敢说行情能100 确定 但傅海棠却提出 在特定情况下 能找到100 确定的行情 他的这个观点也一度引起了广泛的争议 傅海棠说 物极必反 必 是100 不是概率 关键是找到那个

随机推荐

  • Unity3D之sprite动画(Animation)的制作

    实例说明 忍者跑酷的player动画制作 这些都是用Sprite做的动画 在prioject面板里的一组sprite里面点击 之后看属性面板的Sprite Editor对这组Sprite进行编辑 下面先编辑一个idle状态的动画 首先选择第
  • 贝叶斯推断及其互联网应用(一)

    贝叶斯推断及其互联网应用 一 投递人 itwriter 发布于 2011 08 25 14 03 评论 6 有1981人阅读 原文链接 收藏 一年前的这个时候 我正在翻译Paul Graham的 黑客与画家 那本书大部分谈的是技术哲学 但是
  • 二、水平管道中CO2气液两相的流量研究

    水平管道中CO2气液两相的流量研究 3 1 引言 在CCS系统的CO2管道运输过程中 由于传输距离较长且受到管道周围环境的影响 管道中的CO2不可避免的会发生相态的改变 产生气液两相CO2流 因此 本研究基于多传感器系统的测量方法 对水平管
  • android hwcomposer 抓取各个显示图层的raw显示数据

    amlogic 平台 void fill color void vaddr int cnt unsigned int p data p data unsigned int vaddr for int i 0x00 i lt 256 1920
  • 服务器---session理论知识

    1 session理论知识 1 1 session何时创建 1 2 session何时销毁 1 session何时创建 Session 机制 session机制是一种服务器端的机制 用来在无状态的HTTP协议下越过多个请求页面来维持状态和识
  • Mac上Pycharm中安装anaconda的pandas和numpy的方法

    1 点击PyCharm菜单栏下的Preferences 2 选择需要安装的project中的Project Interpreter选项 3 选择一个python版本 如红框1 下面会列出已经安装了的Package 这时点击红框2的anaco
  • 【Mac】Mac下SSH免密登录localhost

    1 背景 问题起因参考 mac下ssh 报错 localhost ssh connect to host localhost port 22 Connection refused 为了在MAC上搭建Hadoop standalone 需要配
  • gtx1050ti最稳定的驱动_更新PC电脑的蓝牙驱动方法

    有时候我们需要更新自己的电脑蓝牙版本使我们在特定环境下更好的使用 下面就来讲讲怎么更新蓝牙版本 一 首先我们要查看自己电脑的蓝牙版本 1 右键点击左下方的开始菜单 找到设备管理器 M 2 点开设备管理器 找到蓝牙并右键属性 并查看驱动程序
  • Vue3 中的 @Options,是做什么的?

    Vue3 中的 Options 是做什么的 Options 是个啥 为什么我的项目中会有 Options 或 Component 啥是 类语法风格的组件 Class Style Component Vue Class Component 更
  • 【Hello mysql】 mysql的复合查询 (重点)

    Mysql专栏 Mysql 本篇博客简介 介绍mysql的复合查询 mysql的复合查询 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员 同时还要满足他们的姓名首字母为大写的J 按照部门号升序而雇员的工资降序排序 使用年薪进行
  • MFC之底层窗口实现01(包括windows窗口消息机制)

    1 MFC需要了解的相关概念 1 SDK和API SDK 软件开发工具包 Software Development Kit 一般都是一些被软件工程师用于为特定的软件包 软件框架 硬件平台 操作系统等建立应用软件的开发工具的集合 也称第三方工
  • 【嵌入式学习-C语言篇】 while & for 的使用

    while for 的使用 while for 的常用场景 自动售货机 判断是否存在待处理订单 智能音箱 打印当前搜索到的wifi热点信息 自动售货机 计算当前所有订单的金额 有收入有退款 代码 include
  • Android解析含有键值是汉字的json串

    Android解析含有键值是汉字的json串 今天在接入百度orc识别身份证的功能时 请求成功后 百度返回的json中发现有的键值是中文 我之前没有遇到过这种情况 依然用在之前项目封装的fastjson正常解析json串 结果解析失败 刚开
  • 性能测试二八原则,响应时间2/5/8原则

    性能测试二八原则 响应时间2 5 8原则 所谓响应时间的 2 5 8原则 简单说 就是 当用户能够在2秒以内得到响应时 会感觉系统的响应很快 当用户在2 5秒之间得到响应时 会感觉系统的响应速度还可以 当用户在5 8秒以内得到响应时 会感觉
  • Java视频学习笔记-19-设计模式

    面向对象思想设计原则 单一职责原则 即高内聚低耦合 每个类应该只有一个职责 对外只能提供一种功能 而引起类变化的原因应该只有一个 功能细化 在设计模式中 所有的设计模式都遵循这一原则 开闭原则 对类的改动是通过增加代码进行的 而不是修改现有
  • zlib库使用简单讲解

    1 zlib库简介 zlib 是通用的压缩库 提供了一套 in memory 压缩和解压函数 并能检测解压出来的数据的完整性 integrity zlib 也支持读写 gzip gz 格式的文件 源码网址 http www gzip org
  • C# 字符串

    文章目录 C 字符串操作 1 获取长度 2 查找字符 3 字符串替换 4 字符串截取 5 字符串插入 C 类型转换 1 隐式类型转换 2 显式类型转换 C Convert方法和Parse 方法 1 Parse 2 Convert C 装箱和
  • 【机器学习-西瓜书】第5章 神经网络

    5 1 神经元模型 定义 神经网络是由具有适应性的简单单元组成的 广泛并行互连的网络 其组织能够模拟神武神经系统对真实世界物体所做出的交互反应 这里的简单单元指 神经元neuron 在神经网络中 每个神经元与其他神经元相连 当超过一个 阈值
  • Bash脚本自学 - 变量和位置自变量

    变量 在hellothere sh文件里 bin bash FIRST NAME Herbert LAST NAME Lindemans echo Hello FIRST NAME LAST NAME 在指令行输入 chmod u x he
  • [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS

    目录 1 Binary Tree Level Order Traversal 二叉树层次遍历 BFS 2 Binary Tree Level Order Traversal II 二叉树层次遍历从低往高输出 BFS 3 Maximum De