树的学习
树是一种非线性结构,它有(此处省略1000字。。)
leetcode
- 二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
分析:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
悄悄问一句,这样行吗
搜索树性质:val(左子树的任意点)<val(根)<val(右子树的任意点)
下面这个应该算是公式法。
C0=1,Cn+1=n+22(2n+1)Cn
开始确实不太理解。但是后来想想应该是用了递归的思想。
这个叫做明安图数。
我用数学归纳法的。。一部分推了一下。应该成立。
理解上
不妨设C(n): 长度为n的序列的不同二叉搜索树个数,f(i):以i为根的不同二叉搜索树个数。
取一个i,i-1个数构成左子树,n-i个数构成右子树。然后可以发现左边可以是C(i-1),右边同理。这样就用到了递归的思想。
2. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
分析:
shezhi(TreeNode left ,TreeNode right){
if(left==NULL&&right==NULL)
return true;
if(right==NULL)
return false;
if(left==NULL)
return false;
else
return true; //判断树的枝叶的状况
如果return true,那么现在树结构上应该是对称了。
接下来判断对称的结点是否相等
通过递归的比较left.left和right.right,left.right和right.left
if(left.val!=right.val)
return false;
return (left.left,right.right)&&(left.right,right.left);
}
- . 恢复二叉搜索树 (困难)
二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。
我的思路不是那引用一堆看不懂的定义算法之类的。。
首先,我选择使用中序遍历
不是leetcode上很多dl都是用此种方法的
二叉搜索树的中序遍历一定是单调递增的.
所以,发现错误节点应该不算难。
将节点先由小到大排序,然后重建二叉树,用sort排过的和错误的二叉树进行每个节点的比较,把不相同的找出,用sort里的覆盖掉错误二叉树上的即可。
接下来是代码实现:
(修改了一下,发在下一个链接上)
这个思路是我借鉴LeetCode上一种据称比较好懂的解答。我本人对树的理解和运用确实不熟,很多东西都没想到或想的不完善。
正在想办法多多补全漏洞。