二叉搜索树 最近共同祖先 c++_二叉树总结

说在前面:非科班的算法小菜鸟,无论是本科还是研究生期间都没有接触过数据结构与算法,为了秋招,硬着头皮刷题~之前看到一篇不错的总结Introduction,博主按照题型进行归类,使用go进行编程,我按照这个博主的顺序,用python重新写了一下:

树的遍历:

前序遍历:根左右

中序遍历:左中右

后序遍历:左右根

  1. 二叉树的最大深度(leetcode104)

题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

思路:递归的思想,比较左右子树的深度

class 

2. 平衡二叉树(leetcode 110)

题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。

思路:|左树的深度-右数的深度|<= 1即为二叉平衡树,空树也为平衡二叉树

class 

3. 二叉树中的最大路径和(leetcode 124)

题目描述:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例:

二叉搜索树 最近共同祖先 c++_二叉树总结_第1张图片

思路:深度优先搜索,每个节点当前的值加上左子树里最大单路径值加上右子树最大单路径值,就是此节点的最大路径和,但是当前节点要返回给上一级节点的不是此节点的最大路径和,因为必须是单路径的,所以return值是当前节点值加上左右子树最大的那段路径值

class 

4. 二叉树的最近公共祖先(leetcode 236)

题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

思路:分治思想,若对于一个树节点,在左子树找到了A,在右子树找到了B,那说明此结点是公共节点,一个结点也可以是自己的祖先

class 

5. 二叉树的层序遍历(leetcode 102)

题目描述:给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)

思路:用一个队列记录一层的元素,然后扫描这一层元素,添加下一层元素到队列

class 

6. 二叉树的层次遍历II (leetcode 107)

题目描述:给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

思路:在层次遍历的基础上翻转一下结果即可,用队列记录

class 

7. 二叉树的锯齿形层次遍历(leetcode 103)

题目描述:给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)

思路:还是可以用队列记录一层的元素,判断res列表的长度,奇数的时候逆序,偶数的时候不变

class 

8. 验证二叉搜素树(leetcode 98)

题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:1、节点的左子树只包含小于当前节点的数 ;2、节点的右子树只包含大于当前节点的数;3、所有左子树和右子树自身必须也是二叉搜索树

思路:中序遍历,检查结果列表是否已经有序

class 

9. 二叉搜索树中的插入操作(leetcode 701)

题目描述:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。

思路:分治思想,如果比根节点大,就插入到右子树,否则插入到左子树,递归结束条件:如果root为None,返回root=TreeNode(val)

class 

你可能感兴趣的:(二叉搜索树,最近共同祖先,c++,平衡二叉树左大右小,本题要求给定二叉树的4种遍历。)