二叉树相关选择题和基本方法
- 选择题1
- 选择题2
- 选择题3
- 选择题4
- 选择题5
- 选择题6
- 选择题7
- 选择题8
- 选择题9
- 选择题10
- 选择题11
- 选择题12
- 选择题13
- 选择题14
- 选择题15
- 选择题16
- 选择题17
- 选择题18
- 选择题19
- 选择题20
- 选择题21
- 选择题22
- 实现二叉树的基本操作
- 查询二叉树当中节点的个数
- 遍历思想
- 子问题思想
- 获取叶子节点的个数
- 遍历思想
- 子问题思想
- 检测值为value的元素是否存在
- 获取一颗二叉树的高度
如果一棵树从1开始按下图一层一层的顺序编号,如果在到最后一个节点前没有出现空节点,那么则这棵树是完全二叉树
在此图中,如果10之前只要存在一个节点不存在,则就不是完全二叉树。
选择题1
解:题目中描述 一颗完全二叉树的某个节点没有左孩子,所以它一定也没有右孩子,所以度为0,为叶子节点,选B
选择题2
解:核心公式:n0 = n2 + 1(n0、n1、n2分别代表度0、1、2的点)
总的节点数 = n0 + n1 + n2;
有题目可得:n0 = 3, n1= 8,所以n2 = 2
所以总的节点数 = 2 + 3 + 8 = 13,选C
选择题3
解:
A:树是一种特殊的无环图,树中的节点不能相交,A错误
B:树的度是指所有节点中度最大的节点的度,B错误
C:树的深度指的是树中的节点存在的最高层数,并不是节点数最多的那一层,C错误
D:D正确
选择题4
解:
- 利用前序遍历和中序遍历还原整颗二叉树
- 得到二叉树的后序遍历
前序遍历字符串的第一个节点一定是根节点
在中序遍历字符串中,5的左边节点一定在5的左子树里,5的右边节点一定在5的右子树。
从前往后逐一将前序遍历的节点当做根节点,再根据该节点在中序遍历的位置得到他的左右子树,就可以构造出二叉树
这是中序遍历的序列
现在我们从前序遍历的5开始。5的左边的数字在5的左子树里,右边数字同理
下一个数字是7,所以4是7的左儿子,由于7的右边没有数字(大前提是在5的左边),所以7没有右儿子
下一个数字是4,由于4左右都没有数字了,所以没有左右儿子,接下来是 数字9
6在9的左边,数字1、2在9的右边
最后 6没有,1在2的左边,所以最终的二叉树长下面这个样子
最终易得后序遍历为 4 7 6 1 2 9 5 ,所以选C
选择题5
解:
1. 假设有一个postIndex下标 从后序遍历序列的末尾开始准备向前遍历
2. 每次找到 后序遍历序列中postIndex下标的值其 所在中序遍历序列的位置
3. 位置左边为左子树,右边为右子树
找到A在中序遍历序列的位置
接着找C,后序遍历优先度是 左 右 根,倒着遍历就相当于是 根 右 左,所以找C 需要优先在A的右子树里找,如果在右子树里找不到,就证明右子树为空树
重复的找,直到postIndex指向 J的左边位置,就可以画出整个二叉树的结构
有了二叉树的结构,易得前序遍历
所以ABDGJHKCEILMF,所以选B
选择题6
解:
- 和选择题4一样,通过前序遍历和中序遍历构造二叉树
- 通过二叉树的结构判断选哪个选项
根据二叉树的结构,选项ABD都是错的,所以选C
选择题7
n0、n1、n2分别代表整棵树中度为0、1、2的节点总个数
解:
- 要么是叶子节点,要么有两颗子树 的意思是 n1 = 0
- m个叶子节点代表 n0 = m
- 又因为 n0 = n2 + 1(所有二叉树都满足的公式),且 节点总数 = n0 + n1 + n2
所以转变成了一下问题
所以最终答案是 2m-1,选C
选择题8
解:
- 最深情况是 每一层只有一个节点,故深度最大是n
- 深度最小的情况是,该二叉树类似于完全二叉树排列,根据完全二叉树的性质,深度为 log(n+1)向上取整
- 所以选A
选择题9
解:
- A选项公式为二叉树一定满足的公式,证明如下
- N 个节点一定有 N - 1 个边(除了根节点所有的都会带一个边)
- n0 + n1 + n2 = N(三种节点相加等于节点总和), 2n2 + 1 n1 + 0*n0 = N - 1(三种边数等于总边数)
- 2*n2 + n1 = n0 + n1 + n2 - 1
- 相消之后 得到 n0 = n2 + 1
选择题10
解:
- 广度优先遍历是一层一层的遍历,只有当把下一步所有可能的位置遍历完才会进行更深层次的遍历,所以选层序遍历
- 深度优先遍历注重深度,会先遍历完一条完整的路径(从跟到叶子的路径),然后退回继续遍历其他路径,前序遍历是一种深度优先遍历
- 所以选D
选择题11
解:
- 易得满足条件的二叉树的深度不是三层就是四层
- 四层的二叉树中,节点B、C、D各自共有两种可能,分别是A、B、C的左孩子或者右孩子,所以共有2 * 2 * 2 = 8种
- 对于三层的情况,我们可以将B固定住然后数一数,共有 6 种情况
- 所以共有 8 + 6 = 14种
选择题12
解: 根据完全二叉树的性质完全二叉树的深度为log(n+1)向上取整,所以选D
选择题13
解:本题考查完全二叉树的性质,深度等于 log(n+1)向上取整 或 log(n) + 1 向下取整,所以选B
选择题14
解:层序遍历的模版就是 首先将根节点入队列然后每次将 出队节点的左右子节点入队列,这样可以保证一定是一层一层进行遍历的,所以本题选择D
选择题15
解:中序遍历的遍历优先度是 左儿子 > 根节点 > 右儿子,根据题目描述值的大小关系为 左 < 根 < 右,故选择 A 中序遍历
选择题16
解:如果根节点从1开始编号,那么n 号节点的左儿子的编号就是 2n,右儿子就是 2n+1,x号节点的父亲则是 x / 2,所以98 / 2 = 49,所以选C
选择题17
解:A、B、D选项都是C选项的一种特殊的情况,也就说满足A、B、D也就一定满足C选项,所以本题一定选C
无论是没有左孩子,还是没有右孩子,还是只有一个节点 都满足 前序遍历和后序遍历刚好相反的,所以不可能选他们当中的一个选项,所以选C。
选择题18
解:
- 1001个节点,由于是奇数个节点且是一个完全二叉树,所以没有度为1的节点,n1 = 0
- 又根据公式 n0 = n2 + 1(n0、n1、n2分别代表度为0、1、2的节点)
- 所以2*n0 - 1 = 1001
- 所以n0 = 501,选C
补充:如果节点是偶数的,那么只有一个度为1的节点
选择题19
解:
- 二叉树指的是树的度最高为2,不是深度为2,所以A选项错误
- B选项除了根节点,每一个节点都需要一条边连向另一个节点
- C选项为满二叉树的性质
- 二叉链代表着每个节点可以获取最多两个节点的信息,比如左右孩子表示法等等,三叉链则比如孩子双亲表示法等等,所以D选项正确
选择题20
解:当这棵树按照完全四叉树的排列顺序排列时此时深度最小,在满四叉树中,节点总数为 40 + 41+ … + 4h-1,根据等比数列求和可以得出 节点总数 = (4h- 1) / 3
当深度为5时,满四叉树的节点总数是 341,当深度为6时,满四叉树的节点总数是1365,所以1000个节点的最小深度就是 6,所以选B
选择题21
解:
- 由题目可得:n3 = 2, n2 = 1, n1 = 2
- 设N为节点总数,则 n0 + n1 + n2 + n3 = N
- N个节点共有 N - 1条边,0*n0 + 1*n1 + 2*n2 + 3*n3 = N - 1
- 解得 n0 = 6,所以选C
选择题22
解:在树中,从根节点到叶子结点有且只有一条通道,所以选择A选项
实现二叉树的基本操作
实现二叉树的基本操作,完成下列函数
public class BinaryTree {
static class TreeNode {
public char val;
public TreeNode left;//左孩子的引用
public TreeNode right;//右孩子的引用
public TreeNode(char val) {
this.val = val;
}
}
/**
* 创建一棵二叉树 返回这棵树的根节点
*
* @return
*/
public TreeNode createTree() {
}
// 前序遍历
public void preOrder(TreeNode root) {
}
// 中序遍历
void inOrder(TreeNode root) {
}
// 后序遍历
void postOrder(TreeNode root) {
}
public int nodeSize;
/**
* 获取树中节点的个数:遍历思路
*/
void size(TreeNode root) {
}
/**
* 获取节点的个数:子问题的思路
*
* @param root
* @return
*/
int size2(TreeNode root) {
}
/*
获取叶子节点的个数:遍历思路
*/
public int leafSize = 0;
void getLeafNodeCount1(TreeNode root) {
}
/*
获取叶子节点的个数:子问题
*/
int getLeafNodeCount2(TreeNode root) {
}
/*
获取第K层节点的个数
*/
int getKLevelNodeCount(TreeNode root, int k) {
}
/*
获取二叉树的高度
时间复杂度:O(N)
*/
int getHeight(TreeNode root) {
}
// 检测值为value的元素是否存在
TreeNode find(TreeNode root, char val) {
return null;
}
//层序遍历
void levelOrder(TreeNode root) {
}
// 判断一棵树是不是完全二叉树
boolean isCompleteTree(TreeNode root) {
return true;
}
}
没有提到的都在下方这个文章里有
二叉树相关oj题
createTree函数里可以自由手动创建一颗自己想要的树,比如我创建了如下图的二叉树
查询二叉树当中节点的个数
遍历思想
思路:遍历思想,遍历整个二叉树。
子问题思想
思路:利用子问题思想