二叉树一种具有天然递归结构的树 ,一种非线性结构

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树,最后一层是满的

完全二叉树:如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布

平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1

二叉搜索树:又叫二叉排序树,二叉查找树,每个节点的值都大于其左子树的所有节点的值,小于其右子树的所有节点的值

leetcode144:二叉树的前序遍历

顺序:访问根节点->前序遍历左子树->前序遍历右子树

void  preorder( Treenode * node){

if (node) {         // 如果节点不为空

count << node->val;   // 打印这个节点的值

preorder ( node ->left);  //左子树

preorder ( node -> right);  //右子树

}

}

2.leetcode 104:给定一个二叉树,找出其最大深度

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

​​

示例:

给定二叉树 [3,9,20,null,null,15,7]

3

/ \

9 20

/ \

15 7 //返回其深度为3

实现了两种做法,都是dfs,一种是递归,一种是借助栈

递归实现:解决递归问题的思路通常都是将一个大的问题递推分解为几个很容易解决的情况,再将这些情况加在一起,就是我们需要的答案,比如说,在这题里,我们需要求的是层数,然后一棵二叉树可以分解为许许多多个左树和右数,我们就通过递归,每递归找到一层,就加上1。

class Solution:

def maxDepth(self, root: TreeNode) -> int:

if not root:

return 0

else:

left_height = self.maxDepth(root.left)

right_height = self.maxDepth(root.right)

return max(left_height, right_height) + 1

//1 代表根节点

使用栈来辅助实现dfs: //时间复杂度O(n)

//空间复杂度:线性表最差O(n)、二叉树完全平衡最好O(lo

class Solution:

def maxDepth(self, root):

stack = []

if root!=None:

stack.append((1, root))

depth = 0 //DFS实现前序遍历,每个节点记录其所在深度

while stack!=[]:

currDepth, root = stack.pop() //记录当前节点所在深度

if root!=None:

depth = max(currDepth, depth) //DFS过程不断比较更新最大深度

stack.append((currDepth+1, root.left))//当前节点的子节点入栈,同时深度+1

stack.append((currDepth+1, root.right))

return depth

3.leetcode 111:给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

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

示例:

给定二叉树 [3,9,20,null,null,15,7],

3

/ \

9 20

/ \

15 7

返回它的最小深度2

1.递归思路:先判断是否root为空,左右子树为空,如果左右子树一边为空,只需要调用另一边子树,如果都不为空,判断两边的最小值再加1

public int minDepth(TreeNode root){

if(root==null) return 0;

if(root.left==null) return 1+minDepth(root.right);

if(root.right==null) return 1+minDepth(root.left);

int minleft=minDepth(root.left);

int minright=minDepth(root.right);

return 1+Math.min(minleft,minright);

}

2.借助栈迭代实现:

class Solution:

def minDepth(self, root):

result = float('inf')

if not root:

return 0

q= [(root, 1)]

while stack:

node, depth = q.pop(0)

if not node.left and not node.right:# 叶子节点

result = min(result, depth)

if node.left:

q.append((node.left, depth + 1))

if node.right:

q.append((node.right, depth + 1))

return result

4.leetcode 226:反转一颗二叉树

示例:输入:

4

/ \

2 7

/ \ / \

1 3 6 9

输出:

4

/ \

7 2

/ \ / \

9 6 3 1

算法:运用二叉树的广度遍历,将每个节点的左子节点和右子节点调换

class Solution{

public TreeNode invertTree(TreeNode root){

if (root == null) return null;

TreeNode temp = root.left;

root.left = invertTree(root.right);

root.right = invertTree(temp);

invertTree(root.left);

invertTree(root.right);

return root;

}

}

5.leetcode 100:same tree

给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入: 1 1

/ \ / \

2 3 2 3

[1,2,3], [1,2,3]

输出: true

示例 2:

输入: 1 1

/ \

2 2

[1,2], [1,null,2]

输出: false

思路:1.当两个结点都为null的时候,表示结点相等

2.当两个结点都不为null

1.结点的值相等,表示当前结点相等, 再判断当前结点的子节点是否相等

2.结点的值不相等,返回false

3.只有一个结点为null, 两个结点一定不想等,返回false

class Solution {

public:

bool isSameTree(TreeNode* p, TreeNode* q){

if(q == NULL && p == NULL) return true;

if(q != NULL && p!= NULL){

if(q->val != p->val) return false;

else return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);

} else return false;

}

};

6.leetcode 101:给定一个二叉树,检查它是否是镜像对称的。

class Solution:

def isSymmetric(self, root):

"""

:type root: TreeNode

:rtype: bool

"""

if not root:

return True

return self.helper(root.left, root.right)

def helper(self, left, right):

if left == None and right == None:

return True

elif left == None or right == None:

return False

elif left.val != right.val:

return False

else:

return self.helper(left.left, right.right) and self.helper(left.right, right.left)

7.leetcode 222:给定一棵完全二叉树,求完全二叉树的节点个数

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,

并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

思路:由 root 根结点往下,分别找最靠左边和最靠右边的路径长度,如果长度相等,则证明二叉树最后一层节点是满的,是满二叉树,

直接返回节点个数,如果不相等,则节点个数为左子树的节点个数加上右子树的节点个数再加1(根节点),

其中左右子树节点个数的计算可以使用递归来计算:

class Solution {

public:

int countNodes(TreeNode* root){

if(!root) return 0;

TreeNode* left=root,*right=root;

int leftCou=0,rightCou=0;

while(left){

leftCou++;

left=left->left;

}

while(right){

rightCou++;

right=right->right;

}

if(leftCou==rightCou) return pow(2,leftCou)-1; //leftcou代表层数

return countNodes(root->left)+countNodes(root->right)+1;

}

};

8.leetcode 110: 给定一个二叉树,判断它是否是高度平衡的二叉树。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

3

/ \

9 20

/ \

15 7

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

1

/ \

2 2

/ \

3 3

/ \

4 4

返回 false 。

思路:求二叉树高度,可以考虑递归深度遍历求解,再考虑本题要求,

发现在深度遍历的同时,可以顺便判断每个结点是否满足其左右子树的高度差的绝对值是否小于等于1,

所以,我们可以用一个全局布尔变量来表示该二叉树是否为平衡二叉树,然后在递归遍历时,

对每个结点进行判断,一旦不满足,就把全局布尔变量置为false,最后在主函数中返回该布尔变量即可。

class Solution {

public:

bool isBalanced(TreeNode* root){

height(root);

return is_balance;

}

private:

bool is_balance = 1; //全局布尔变量

int height(TreeNode *p){

if(p != NULL){

int lh = height(p->left), rh = height(p->right); //递归求解结点p的左右子树高度

if(abs(lh - rh) > 1)

is_balance = 0; //高度差绝对值大于1,将is_balance置为false

return max(lh, rh)+1; //返回以该结点为根结点的树的高度

}

else

return 0; //如果为结点为空,返回高度0

}

};

9. leetcode 112:路径总和:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和

给定如下二叉树,以及目标和 sum = 22,

5

/ \

4 8

/ / \

11 13 4

/ \ \

7 2 1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

class Solution:

def hasPathSum(self, root, sum):

if root is None:

return False

if sum == root.val and root.left is None and root.right is None:

return True //叶子节点

return self.hasPathSum(root.left, sum-root.val) or self.hasPathSum(root.right, sum-root.val)

10.leetcode 404:给定一个二叉树,求其所有左叶子的和,使用递归,若当前节点的左节点是叶子,把当前节点的左节点的值加入和中,否则对其左右节点进行递归。

public int sumOfLeftLeaves(TreeNode root){

if(root == null)

return 0;

int sum = 0;

if(root.left != null && root.left.left == null && root.left.right == null)

sum += root.left.val;

return sum + sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right);

}

11.leetcode 257:给定一个二叉树,返回所有从根节点到叶子节点的路径。

输入:

1

/ \

2 3

\

5

输出: ["1->2->5", "1->3"]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

原文链接:https://blog.csdn.net/weixin_40833838/article/details/105722784

大学计算机python考试题二叉树_leetcode 二叉树相关习题总结相关推荐

  1. 20210330:二叉树力扣相关习题复习(上)

    20210330:二叉树力扣相关习题复习(上) 题目 思路与算法 代码实现 写在最后 题目 路径总和 II 二叉树的最近公共祖先 二叉树展开为链表 思路与算法 路径总和 II:经典三序遍历二叉树题目, ...

  2. 大学计算机基础万维考试题库,大学计算机基础考试题库-20210614012802.docx-原创力文档...

    Company number:[0089WT-8898YT-W8CCB-BUUT-202108] Company number:[0089WT-8898YT-W8CCB-BUUT-202108] 大学 ...

  3. 贵大计算机网络期末考试题,贵州大学大学计算机基础考试题库-客观题1.doc

    贵州大学大学计算机基础考试题库-客观题1 一. 单项选择题 1.人工智能的理论基础由( )奠定 A.巴贝奇 B.图灵 C.冯.诺依曼 D.卡诺 2.计算机集成制造系统的英文缩写是( ) A.CAT B ...

  4. 2017大学计算机考试题,2017年大学计算机一级考试题库

    2017年大学计算机一级考试题库 计算机的发展和应用已不仅是一种科学的技术现象而且是一种政治.经济.军事和社会现象.下面是小编整理的大学计算机一级考试题库,欢迎大家参考! 1.电子计算机主要是以( ) ...

  5. 计算机思维导论二讲答案,大学计算机计算思维导论第2讲习题与解析.pdf

    大学计算机计算思维导论第2讲习题与解析.pdf 第2讲-习题解析 战德臣 哈尔滨工业大学计算机学院教授.博士生导师 教育部大学计算机课程教学指导委员会委员 OKOK ZhanDCZhanDC Rese ...

  6. 大学计算机python期末考试_大学计算机程序设计(Python)_章节测验,期末考试,慕课答案查询公众号...

    大学计算机程序设计(Python)_章节测验,期末考试,慕课答案查询公众号 更多相关问题 [问答题,论述题] 在上课时,有些平时不受老师重视的学生有的爱讲话,有的爱做小动作,特别是坐在窗边的学生则爱把 ...

  7. 大学计算机知识考试题,大学计算机基础理论知识前三章测试题

    <大学计算机基础理论知识前三章测试题>由会员分享,可在线阅读,更多相关<大学计算机基础理论知识前三章测试题(8页珍藏版)>请在装配图网上搜索. 1.第一章引论选择题1. 工资管 ...

  8. 大学计算机python编程的函数及作用总结_【转】python 内置函数总结(大部分)...

    python 内置函数大讲堂 python全栈开发,内置函数 1.内置函数 python的内置函数截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python ...

  9. 石油大学计算机在线考试题,中国石油大学2020年春季《计算机应用基础》在线考试答卷附标准答案...

    中国石油大学2020年春季<计算机应用基础>在线考试补考附标准答案 试卷总分:100 得分:100 一.单选题 (共 50 道试题,共 100 分) 1.操作系统中对文件的确切定义应该是_ ...

  10. 大学计算机python期末考试用什么软件_大学计算机--Python算法实践_章节测验,期末考试,慕课答案查询公众号...

    [单选题]IP 地址10.0.10.65 和掩码255.255.255.224 代表的是一个 A. 主机地址 B. 网络地址 C. 广播地址 D. 以上都不对 [单选题]一般而言,在常年定期.定量交易 ...

最新文章

  1. python列出文件夹所有文件_python列出文件夹所有文件有哪些方法?
  2. 规则引擎 设计 git_引擎盖下的Git
  3. python3 装饰器_python3_装饰器_异常处理
  4. pcl从一个点云里面导出下标
  5. java 如何让程序一直运行的程序_java – 如何在程序结束前让方法在后台持续运行?...
  6. java编写设置按钮随机背景色_java – 如何设置自定义按钮状态背景颜色?
  7. mysql实例 oracle实例 区别_ORACLE实例与数据库的区别
  8. Asp.Net 之 枚举类型的下拉列表绑定
  9. Flash网络游戏简单的源代码
  10. android连接苹果蓝牙耳机,苹果蓝牙耳机怎么配对 苹果蓝牙耳机怎么配对安卓手机 苹果蓝牙耳机使用说明...
  11. c语言运行的快捷键是什么,c语言执行命令快捷键是什么??
  12. 一个HTTP打趴80%面试者
  13. 头同尾合十的算法_尾同头合十或头同尾合十等的速算方法word精品
  14. 解决IE浏览器打开,出现不能为“read”的问题
  15. CAD -2012软件安装的讲解
  16. PyTorch-05神经网络与全连接(Logistic Regression、交叉熵、交叉熵来优化一个多分类的问题、全连接层(MLP网络层)、激活函数与GPU加速、测试、Visdom可视化)
  17. 修改Thinkphp-cmf上传视频大小限制
  18. 解决银河麒麟系统开机后桌面无图标,只有下方开始菜单和任务栏可操作问题
  19. Java实现TCP的长短链接
  20. 什么是进程? 为什么使用进程? 如何运用进程?

热门文章

  1. 《Flutter 从0到1构建大前端应用》读后感—第9章【插件与混合工程】
  2. Android-【报错】java.lang.ClassCastException: .MainActivity cannot be cast to java.lang.Runnable
  3. Android FrameLayout 帧布局
  4. 2017-2018-1 20155320 嵌入式C语言——时钟
  5. NDK配置文件Android.mk简介
  6. SQL Server 2008安装和配置图解图(转)
  7. 华为静态路由配置及讲解
  8. html5 成语连连看,全国通用五年级下册语文讲义-阅读与作文:学写读后感(含答案)[参考].pdf...
  9. C++ select模型聊天室初版
  10. 24. Swap Nodes in Pairs 1