二叉树学习记录:
构造二叉树类:
1.从中序和后序、中序和前序构造二叉树:
必须有中序,否则无法区分一个节点的左子树和右子树
2.最大二叉树:
3.平衡二叉搜索树:
4.有序数组构造二叉搜索树
以上4题的思路基本是一致的,对于每次递归遍历数组,都要找到该数组中符合条件的头节点,然后根据逻辑重新划分左右区间数组,返回值为节点的指针。
递归类:
合并二叉树:
创建一个新的树或者把一棵树的节点值加到另一棵树上。
二叉树的最近公共祖先节点:
如果一个节点左或者右子树是目标之一,则返回该节点,如果不是返回空,
递归到上层如果左或者右有返回节点,由于是递归向上,即找到的第一个就是最近的。
二叉搜索树相关:
二叉搜索树是一类树,其每个节点的右子树的每个值都大于节点值,左子树的每个节点值都大于节点的节点值,其左右子树也都是二叉搜索树
1。利用这一特性可以减少很多递归
2。对于二叉搜索树,因为其是有序的,因此经常需要找相邻节点,此时双指针的思路比较好用。
遍历
1.二叉搜索树中的搜索:利用节点值的大小判断是在左还是右子树中找
普通二叉树:递归找,找到返回。
2.验证二叉搜索树:中序(左中右)遍历得到的应该是一个有序数组,可以检查其数组的有序性,也可以采用双指针比较。
3、最小绝对值差:
由于BST是有序的,因此最小绝对插值一定是相邻节点的元素,因此用双指针
普通二叉树:递归得到数组后sort ,然后找相邻元素。
4.众数:有序递归的一定是 相邻的,因此可以设置计数器,对于count==max的值存入结果集,如果有比这个max还大的,就清空结果集然后更新max。
普通二叉树:遍历得到哈希,然后比较其value。
5.二叉树转换为累加树
利用二叉搜索树的有序性,其从右下角递归到左下角是递减的,即右下角不用修改,左下角修改为全部元素的和,采用双指针递归两个相邻元素。
6.二叉搜索树的最近公共祖先
利用节点值判断省去一些递归
插入
5.在二叉搜索树中插入一个节点,递归的找到该节点所属位置的空节点并且插入。
修剪
最难的类型,要更改整个树的结构,即对于节点,递归的修建其左右子树,并且把修改后的左右子树返回到node->left和node->right。
根据子树节点的情况:
左右都无:删去该节点后只剩下空,返回空
左无:返回右
右无:返回左
都有:根据节点修改,左树应该是返回节点的左树,右树应该是返回节点,即找到左树最大节点的一个跨节点相邻最近节点。
删除二叉树中的节点:
修建二叉搜索树: