剑指offer常见题 - 二叉树问题(三)

news/2024/7/15 17:29:19 标签: 算法, 图论, 数据结构

二叉树相关算法

二叉树相关性质
性质一:在二叉树的第i层上至多有2^(i-1)个结点(i>=1)

性质二:深度为k的二叉树至多有2^(k-1)个结点(k>=1)

性质三:对任意一颗二叉树T,若终端结点数为 n 0 n_0 n0 ,而其度数为2的结点数为 n 2 n_2 n2,则 n 0 n_0 n0 = n 2 n_2 n2 + 1。
性质四:具有n个结点的完全二叉树的深度为 ⌊log n⌋+1(以2为底)

满二叉树:深度为k,且有2^(k-1)个结点的二叉树。 在满二叉树中,每层结点都是满的,即每层节点都具有最大结点数。

完全二叉树:深度为k,结点数为n的二叉树,如果其结点1n的位置序号分别于满二叉树的节点1n的位置序号一一对应,则为完全二叉树。可见,满二叉树必为完全二叉树,而完全二叉树不一定是满二叉树。

题目

不分行从上往下打印二叉树

典型题例:

从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。

示例 :

输入:
输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
    8
   / \
  12  2
     /
    6
   /
  4

输出:[8, 12, 2, 6, 4]

思路
( B F S ) O ( n ) (BFS) O(n) (BFS)O(n)
我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左儿子,再扩展右儿子。
这样我们会:

  1. 先扩展根节点;
  2. 再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点;
  3. 再依次从左到右扩展第三层节点;
  4. 依次类推
    所以BFS的顺序就是这道题目要求的顺序。

时间复杂度:
BFS时每个节点仅被遍历一次,所以时间复杂度是 O(n)O(n)。

代码:

/**
 * 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<int> printFromTopToBottom(TreeNode* root) {

        vector<int> res;        //定义返回数组    
        if (!root)  return res; //判定边界条件

        queue<TreeNode*> q;     //定义队列
        q.push(root);           //把根结点加入队列

        while (q.size()){

            auto t = q.front();
            q.pop();
            res.push_back(t->val);  //将val加入数组中

            //判断是否有左右子树
            if (t->left)    q.push(t->left);    //有左子树就加入队列
            if (t->right)   q.push(t->right);   //有右子树就加入队列

        }

        return res;
    }
};

分行从上往下打印二叉树

典型题例:

从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。

示例 :

输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
    8
   / \
  12  2
     /
    6
   /
  4

输出:[[8], [12, 2], [6], [4]]

思路
核心
在上一道题 《不分行从上往下打印二叉树》 的基础上修改代码。
区别在于,每一层结束的时候,往queue里塞一个NULL做标记。

queue里读取一个数出来之后,先看看是不是level标识符NULL(因为是BFS,当前level读完,下一个level有哪些要读的也都放在queue里了,可以在queue结尾给加一个新的NULL), 是的话再看看是不是整个树读完了(即queue里没有点了)。

时间复杂度分析:每个点遍历一次

代码:

/**
 * 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>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>> res;
        if(!root) return res;
        queue<TreeNode*> q;
        q.push(root);
        q.push(NULL); //root层的标识符

        vector<int> cur;
        while(q.size()){
            TreeNode* t = q.front();
            q.pop();

            if(t){ //跟上一道题同样的操作
                cur.push_back(t->val);
                if(t->left) q.push(t->left);
                if(t->right) q.push(t->right);
            }
            else{
                if(q.size()) q.push(NULL); 
                res.push_back(cur); 
                cur.clear();
            }
        }
        return res;

    }
};

充电站
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习


http://www.niftyadmin.cn/n/3954.html

相关文章

java8 新特性5 方法引用

一 方法引用 :: 该符号为引用运算符&#xff0c;而它所在的表达式被称为方法引用 二 案例实操 2.1 对象实例方法 引用对象的实例方法&#xff0c;其实就引用类中的成员方法 格式 对象::成员方法 1.接口 public interface Duixiang {public String toUpper(String str); }…

Oracle Primavera Unifier Version 22.10 新特征

目录 Primavera Unifier 22.10 Primavera Unifier 22.9 Primavera Unifier 22.8 Primavera Unifier 22.7 Primavera Unifier 22.6 Primavera Unifier 22.5 Primavera Unifier 22.4 Primavera Unifier 22.3 Primavera Unifier 22.2 这个10月&#xff0c;Oracle更新了P…

英语语法汇总(13.虚拟语气)

英语语法汇总&#xff08;13.虚拟语气&#xff09; 概述 说话人主观愿望&#xff0c;推测等&#xff0c;而非客观情况&#xff0c;用在非真实条件句中 How I wish I were a bird 虚拟语气的基本形式 与所描述的情况与目前事实不符&#xff0c;用现在虚拟语气&#xff0c;与…

STL类模板入门

Unit04 类模板 01 类模板的声明 形式&#xff1a;template<class 类型形参1, …> class 类模板名 { … }; 例如&#xff1a; template<class A, class B> class CMath { public:A m_a;B func() { ... }; };如果在类模板外实现成员函数 template<class 类型形参…

基于JAVA客户台账管理计算机毕业设计源码+系统+mysql数据库+lw文档+部署

基于JAVA客户台账管理计算机毕业设计源码系统mysql数据库lw文档部署 基于JAVA客户台账管理计算机毕业设计源码系统mysql数据库lw文档部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&a…

Docker命令

1. docker run 1.1. 命令说明 创建一个新的容器并运行一个命令 1.2. 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 1.3. OPTIONS说明 -a stdin: 指定标准输入输出内容类型&#xff0c;可选 STDIN/STDOUT/STDERR 三项&#xff1b; -d: 后台运行容器&#xff0c;并返…

C++11: final override

引言 final和override都是C11新引入的关键字&#xff0c;由于两关键字都于继承控制相关&#xff0c;所以我们称final和override为继承控制关键字&#xff0c;需要说明的是final 可作用于类&#xff0c;亦可作用于成员函数&#xff0c;override则只能作用于虚函数。 我们简单介…

React 支持多语言翻译国际化 -- i18next

前言 如果我们的项目需要更多的流量&#xff0c;支持其他国家的语言是必不可少的。对于React项目我们该如何实现项目多语言&#xff0c;让工程走向国际化&#xff0c;本文将介绍目前最通用的解决方案 i18next。 准确是说 i18n并不仅仅是为 React 而生&#xff0c;为了支持Rea…