题目简介:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。
例如,
123456789给定二叉搜索树: 4 / \ 2 7 / \ 1 3和 插入的值: 5
你可以返回这个二叉搜索树:
12345 4 / \ 2 7 / \ /1 3 5
或者这个树也是有效的:
5
/...
题目简介:给定一个二叉树,返回它的 后序 遍历。
示例:
12345678输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:递归的算法就不说了,很熟练了。
说说迭代的方法,也就是把递归栈显式的表达出来。这时需要将处理的节点放入栈之后,紧接着放入一个空指针作为标记。
这种方法对于前中后序遍历都可用,只需交换次序即可。
代码如下:12345678910111213141516171819202122232425262728293031323334353637383940414...
题目简介:给定一个二叉树
123456struct Node { int val; Node *left; Node *right; Node *next;}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例:
123输入:root = [1,2,3,4,5,null,7]输出:[1,#,2,3,#,4,5,7,#]解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 ...
题目简介:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
[]:
123输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
123输入: ...
题目简介:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
1234[ [5,4,11,2], [5,8,4,5]]
思路:关于树的回溯题,其实和数组的差不多,需要注意的是结点的val值可能为负的。
代码如下:12345678910111...
题目简介:根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
例如,给出
12中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
12345 3 / \9 20 / \ 15 7
思路:我们首先将每个结点在中序遍历中的位置存储下来。
因为后序遍历的顺序为左右根,所以从后序遍历的最后一个结点开始遍历(树的根节点)。
每次根据后序遍历遍历到的结点去找出该结点在中序遍历中的位置,然后递归即可。
tip:
由于后序遍历是左右根,所以递归时是先构建右子树,再构建左子树。...
题目简介:给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:给定 BST [1,null,2,2],
123451 \ 2 /2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
思路:没想太多,首先第一次遍历,将记录存入哈希表中,并找出其中的最大出现次数Maxnum。
第二次遍历哈希表,将出现次数等于Maxnum的值存入结果数组中,最后返回即可。
tip:
学会哈希表的遍历
...
题目简介:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
1234567891011121314输入: Tree 1 Tree 2 1 2 / \ ...
题目简介:给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
123输入:[0,0,null,0,0]输出:1解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
123输入:[0,0,null,0,null,0,null,null,0]输出:2解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。
思路:后序遍历,自下而上的来解决问题。
我们将结点的状态分为三...
题目简介:给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
123456789输入: 原始二叉搜索树: 5 / \ 2 13 输出: 转换为累加树: 18 / \ 20 13
思路:一开始的想法是先将结点值都一个个保存下来,然后再遍历搜索累加,但是这样子很慢。
后来发现这是个二叉搜索树,那么...