力扣3
41 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
解:
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if(root==null){ return res; } for(Integer i : inorderTraversal(root.left)){ res.add(i); } res.add(root.val); for(Integer i:inorderTraversal(root.right)){ res.add(i); } return res; }
42 不同的二叉搜索树
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解:
public int numTrees(int n) { if(n==0 || n==1){ return 1; } int res = 0; for(int i=0;i<n;i++){ res += numTrees(i)*numTrees(n-1-i); } return res; }
语义:g ( n ):以1...n为节点的二叉搜索树的个数,由于难以看出和g(n-1)的关系,分类讨论细化问题:
以1开头的算一类,以2开头的算一类....所有这些加起来就OK
对于以 i开头的,左边有i-1个节点,右边有n-1 个节点,所以有 g(i-1) * g( n-i )
所以
g( n ) =g(0) * g(n-1) + g(1)*g(n-2)+....+g(n-1)g(0)
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解:
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

浙公网安备 33010602011771号