选择题
🌈eg1
一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树,叶子节点的个数最多会差多少个()?
正确答案: C
A. 3 B. 5 C. 7 D. 9
🌈eg2
一棵有 n 个结点的二叉树,按层次从上到下、同一层从左到右顺序存储在一维数组 A[1…n] 中,则二叉树中第 i 个结点(i从1开始用上述方法编号)的右孩子在数组 A 中的位置是( )
正确答案:D
A. A[2i](2i <= n)
B. A[2i + 1](2i + 1 <= n)
C. A[i - 2]
D. 条件不充分,无法确定
🌈eg3
已知-算术表达式的中缀表达式为 a-(b+c/d)*e , 其后缀形式为( )
正确答案:D
A. -a+b*c/d
B. -a+b*cd/e
C. -+*abc/de
D. abcd/+e*-
🌈eg4
将一棵有100个结点的完全二叉树从根这一层开始,开始进行层次遍历编号,那么编号最小的叶节点的编号为(),则编号为 98 的节点的父节点编号为()。 (根节点为1)
正确答案:51, 49
🌈eg5
设二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是()。
正确答案:B
A. 空或只有一个结点 B. 高度等于其结点数
C. 任一结点无左孩子 D. 任一结点无右孩子
🌈eg6
某二叉树共有 399 个结点,其中 有199个为 度为2的 结点 ,则该二叉树中的叶子节点数为()
正确答案:C
A. 198 B. 199 C. 200 D. 201
🌈eg7
在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个
正确答案:D
A. 7 B. 0 C. 7 D. 6
🌈eg8
设一棵完全二叉树具有1000个结点,则此完全二叉树有()个度为2的结点。
正确答案:C
A. 497 B. 498 C. 499 D. 500
编程题
🎈eg1
从根到叶的二进制数之和
class Solution {
public:
int dfs(TreeNode * root, int val){
if(root == nullptr) return 0;
val = (val << 1) | root->val; //二进制转10进制
if(root->left == nullptr && root->right == nullptr) { //求叶子节点
return val;
}
return dfs(root->left, val) + dfs(root->right, val);
}
int sumRootToLeaf(TreeNode* root) {
return dfs(root, 0);
}
};
🎈eg2
二叉树的坡度
class Solution {
public:
int ans = 0;
int dfs(TreeNode* root){
if(root == nullptr) return 0;
int sl = dfs(root->left);
int sr = dfs(root->right);
ans += abs(sl - sr);
return sl + sr + root->val;
}
int findTilt(TreeNode* root) {
dfs(root);
return ans;
}
};
🎈eg3
奇偶树
class Solution {
public:
bool isEvenOddTree(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int level = 0;
while(!q.empty()){
int sz = q.size();
int pre = level == 0 ? 0 : 1e6 + 1;
for(int i = 0; i < sz; i++){
TreeNode* next = q.front();
q.pop();
// 偶数递减 奇数递增
if((level == 0 && next->val <= pre) || (level == 1 && next->val >= pre))
return false;
//奇偶
if((level == 0 && next->val % 2 == 0) || (level == 1 && next->val % 2 == 1))
return false;
pre = next->val;
if(next->left) q.push(next->left);
if(next->right) q.push(next->right);
}
level ^= 1;
}
return true;
}
};