1.二叉树的最大深度
最简单的应该还是左右子树最大的+1
2.二叉树的最小深度
最后用个min比较左右子树,小的+1
3.从中序和后序构造二叉树
得先定义一个unordered_map<int,int> m;然后将所有inorder的存到map中,m[inorder[i]]=i;调用的build函数的6个参数分别是(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1),在这个函数里,首先不知道为啥,s0>e0||s1>e1就是NULL,然后定义根节点为postorder的e1。定义一个mid为中序的根节点,定义num为mid-中序的s0。左子树的build参数为:inorder,s0,mid-1,postorder,s1,s1+num-1。右子树的build参数为:inorder,mid+1,e0,postorder,s1+num,e1-1。
4.从前序和中序找
和前面差不多,就是先前序后中序,左子树为:preorder,s0+1,s0+num,inorder,s1,mid-1。右子树为:preorder,s0+num+1,e0,inorder,mid+1,e1
5.二叉树的层次遍历
用DFS,先用DFS求出树的高度,再用DFS对每一层遍历。DFS(ret,root,0)
6.层次遍历,但是从下向上排列
就是DFS函数(ret,ret.size()-1,root)
7.层次遍历,zigzag反转一下
for(int i = 1;i<vals.size();i+=2){
reverse(val[i].begin(),vals[i].end());
}
8.判断一棵树是不是镜像树
1. 左右两个节点的大小是否相同.
2. 左节点的左孩子是否和右节点的右孩子相同.
3. 左节点的右孩子是否和右节点的左孩子相同
9.判断两棵树是否相同
DFS递归前序遍历
10.判断一棵树是否为平衡二叉树
也是用DFS递归判断,用diffHeight判断左右子树相差是否大于1,大于1就返回错误,否则令diffHeight为树的高度
11.给定二叉树从根节点到一叶子节点和为给定值
还是DFS,DFS(target,sum,root)
12.给定二叉树,前序遍历
对于前序遍历,根节点是最先访问的,然后是左子树,最后才是右子树。当访问到根节点的时候,我们需要将右子树压栈,这样访问左子树之后,才能正确地找到对应的右子树。
13.中序遍历
对于中序遍历,首先遍历左子树,然后是根节点,最后才是右子树,所以我们需要用stack记录每次遍历的根节点,当左子树遍历完成之后,从stack弹出根节点,得到其右子树,开始新的遍历。(其实也没用栈,用的vector)
14.后序遍历
15.在一棵完全二叉树中使用next指针连接旁边的节点
如果一个子节点是根节点的左子树,那么它的next就是该根节点的右子树,譬如上面例子中的4,它的next就是2的右子树5。
如果一个子节点是根节点的右子树,那么它的next就是该根节点next节点的左子树。譬如上面的5,它的next就是2的next(也就是3)的左子树。
17.上一题不是完全二叉树
不光需要提供first指针用来表示一层的第一个元素,同时也需要使用另一个lst指针表示该层上一次遍历的元素
18.将一个排好序的链表转成一个平衡二叉树
我们需要找到链表的中间节点,这个就是根节点,链表的左半部分就是左子树,而右半部分则是右子树,我们继续递归处理相应的左右部分,就能够构造出对应的二叉树了。
19.将一个排好序的数组转成一个平衡二叉树
求中间节点直接就mid=start + (end-start)/2;
20.一颗二叉树,将其扁平化处理
只需要前序遍历二叉树同时处理就可以了
21.判断是不是一个正确的二叉搜索树
通过递归整棵树来解决