二叉树定义
后序遍历
中序遍历
先序遍历
层级遍历
之字打印二叉树
中序遍历后按层反转vector
二叉搜索树转循环链表
//二叉搜索树转双向循环链表(中序遍历)
二叉树的最大路径和(*)
路径为一条从树中任意节点出发,达到任意节点的序列(不一定经过根节点)
为了便于理解,给出示例。
判断对称二叉树
时间复杂度是 O(n),因为需要遍历二叉树的每个节点一次。在递归过程中,对每个节点的左子树和右子树进行对称性的比较。对于每个节点,进行常数时间的值比较,并递归地检查其子节点。由于每个节点只会被访问一次,时间复杂度是线性的。
判断平衡二叉树
判断是否是相同的树
时间复杂度O(n)
合并二叉树
两个二叉树对应位置相加,如果有一个为空视为0,返回新的二叉树
左叶子之和
带标记信息的dfs:用flag标记当前节点是父节点的左节点还是右节点,1左2右
最大深度
最小深度
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
需要讨论三种特殊情况注意
答案为5。
最近公共祖先
构建二叉树
由有序数组构造高度平衡的二叉搜索树
由前序遍历和中序遍历构建二叉树
前序遍历:根[左][右]
中序遍历:[左]根[右]
map存索引,中序找根,求左区间长度
树的子结构:
isSubTree(A,B)://判断B是否是A的子结构
思路:先序遍历A,每个节点分别判断以B为根的树是否是该树的子树
LeetCode129 求根节点到叶节点数字之和
输入:root = [1,2,3]。输出:25。从根到叶子节点路径 1->2 代表数字 12。从根到叶子节点路径 1->3 代表数字 13。数字总和 = 12 + 13 = 25。
root,sum表示[已经]遍历root节点所有sum的值???
判断完全二叉树
判断二叉搜索树
中序遍历有序;list存放中序遍历的序列
二叉搜索树下一个节点:
如果root.val<=p.val说明下一个节点一定在root右子树中
否则节点要么 在左子树中,要么是root
二叉搜索树的插入
二叉搜索树的搜索
二叉搜索树第k大节点: 后序遍历k次停下返回
二叉搜索树转平衡二叉树
二叉搜索树转换为累加数:BST节点的权值变为大于等于节点权值之和
节点的权值变为中序遍历的后缀和,即右中左序列的前缀和
修剪二叉搜索树:
删除节点使BST所有节点都在[low,high]范围内:
二叉搜索树的删除:
翻转二叉树
二叉树展开为链表
把左子树展开成单链表,根节点指向左孩子节点,把右子树展开成单链表。左子树单链表的尾结点指向右子树的头结点(左子树不为空)。当左子树为空时,根节点直接指向右子树展开的单链表的头结点
二叉树的序列化和反序列化(剑指 Offer 37)
剑指offer:二叉树中序遍历的下一个节点
【二叉树】993. Cousins in Binary Tree
题意:定义堂兄弟节点:层数相同,但是父节点不相同。
思路:dfs,记录层数和父节点的值。
返回一个数组,里面存层数和父节点的值
LeetCode 654 最大二叉树
递归出口:
(1)nums数组为空,返回空节点
(2)nums数组个数为1,返回用该值构造的根节点
递归体:
找到nums最大值,构造根节点
找出nums中最大值max和最大值下标max_index 构造根节点
数组分为最大值左面的数组nums1,最大值右面的数组nums2
二叉树的所有路径(LeetCode 257)
1.递归
递归函数声明:
vector<string> binaryTreePaths(TreeNode* root) ;
递归出口:
(1)如果根节点为空,返回 “ ”
(2) 如果根节点不为空且根节点的左右节点都为空,返回“root->val”
递归体:
如果根节点不为空且根节点的左右节点不全为空,递归求出左子树的路径和右子树的路径,
在左子树和右子树所有路径前加上“(root->val)->”
c++中string操作:
vector<string>s,s为存放字符串的动态数组
s=s1+s2为字符串的拼接
to_string(n) 把整数n转换成字符串
剑指 Offer II 047. 二叉树剪枝
注意顺序。
求完全二叉树结点个数(leetcode 222)
平衡二叉树的判定(LeetCode 110)
递归出口:
(1)根节点为空,返回真 (2)根节点左右孩子节点都为空,返回真
递归体:
根节点左右孩子节点不全为空,递归判断左右子树是否为平衡二叉树。
如果 左右子树有一个不是平衡二叉树,返回假。
如果 左右子树都是平衡二叉树,且左右子树的高度差小于等于1,返回真。
二叉树的镜像
递归:
如果二叉树为空,返回空
如果二叉树为叶子节点,返回叶子节点
递归反转左子树和右子树
改变根节点的指向
LeetCode1161 最大层内元素和
返回一层中和最大的层号,如果有多个最大和,返回最小层数
二叉树求到某一个节点路径
递归出口:当根节点为空时,返回空数组。
当根节点不为空,如果根节点值为val,返回只有根节点的数组。当只有根节点,且根节点值不为val,返回空数组。
递归体:递归求出左子树到val的路径,递归求出右子树到val的路径,在路径前加入根节点。
LeetCode513 找左下角的值
层序遍历最后一层第一个值
LeetCode 543 二叉树的直径
给你一棵二叉树的根节点,返回该树的直径。二叉树的直径是指树中任意两个节点之间最长路径的长度.这条路径可能经过也可能不经过根节点root。两节点之间路径的长度由它们之间边数表示。
LeetCode113 路径总和
注意:
(1)if(sum>target)不能作为剪枝的条件,因为数可能是负数,所以会越加越小。
(2)不能使用root为空作为递归的出口,因为叶子节点会走两次到空节点,结果会重复。
LeetCode 662 二叉数的最大宽度
给你一棵二叉树的根节点 root,返回树的 最大宽度。树的最大宽度是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。题目数据保证答案将会在32 位带符号整数范围内。
二叉树的序列化和反序列化(剑指offer)
二叉树的序列化
方法:先序遍历这颗二叉树,遇到空子树的时候序列化成 None
,否则继续递归序列化
二叉树的反序列化