力扣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)

 

43. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 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

 

posted @ 2020-09-18 16:52  Jary霸  阅读(152)  评论(0)    收藏  举报