树相关的面试题整理

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.判断是不是一个正确的二叉搜索树

通过递归整棵树来解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值