答案:n0 = 3,n1 = 1,n2 = 2,3 = 2 + 1 成立。
C++props_n0.cpp — 验证性质3:n0 = n2 + 1
#include <iostream>
#include <string>
using namespace std;
struct TreeNode { int val; TreeNode *l, *r;
TreeNode(int v) : val(v), l(nullptr), r(nullptr) {} };
int pos = 0;
TreeNode* build(const string a[], int n) {
if (pos >= n) return nullptr;
string s = a[pos++];
if (s == "#") return nullptr;
TreeNode* t = new TreeNode(stoi(s));
t->l = build(a, n); t->r = build(a, n);
return t;
}
void count(TreeNode* r, int& n0, int& n1, int& n2) {
if (!r) return;
int d = (r->l ? 1 : 0) + (r->r ? 1 : 0); // 度:0 / 1 / 2
if (d == 0) n0++; else if (d == 1) n1++; else n2++;
count(r->l, n0, n1, n2);
count(r->r, n0, n1, n2);
}
int main() {
string a[] = {"1","2","4","#","#","5","#","#","3","#","6","#","#"};
int n = sizeof(a) / sizeof(a[0]);
TreeNode* root = build(a, n);
int n0 = 0, n1 = 0, n2 = 0;
count(root, n0, n1, n2);
cout << "n0(叶子) = " << n0 << endl;
cout << "n1(度为1) = " << n1 << endl;
cout << "n2(度为2) = " << n2 << endl;
cout << "性质3 验证:n0 = n2 + 1 -> " << n0 << " = " << n2
<< " + 1 " << (n0 == n2 + 1 ? "成立" : "不成立") << endl;
return 0;
}
运行结果
n0(叶子) = 3
n1(度为1) = 1
n2(度为2) = 2
性质3 验证:n0 = n2 + 1 -> 3 = 2 + 1 成立
思路:先序串里遇到 # 就返回空,否则建结点并递归读出左右子树;建好后对每个结点数一数它有几个孩子:0 个记入 n0、1 个记入 n1、2 个记入 n2。
易错:读到 # 时忘了让位置指针也前进一格,后面整串字符会全部错位。