各サブツリーに対して、偶数ラベルの偶数ラベルと奇数ラベルの葉数サブツリーのノードにその番号をラベル付けして格納することもできます。バイナリ検索ツリーのノードにある特定のリーフの数を格納する(最適化)
たとえば、this tree(出力は左側にあります)。
は、これが機能し、「カウンター」と「updateNode」一緒に罰金ではありませんどのような私のコード
struct node {
int label;
node*right;
node*left;
int L; //i use this to store the number of leaves
};
void addnodeBST(node*&tree, int l) { //adds a node
if (!tree) {
tree = new node;
tree->label = l;
tree->right = tree->left = 0;
tree->L = 0;
return;
}
if (l < tree->label)
addnodeBST(tree->left, l);
if (l > tree->label)
addnodeBST(tree->right, l);
}
int counter(node*tree, int x) {
if (!tree)
return 0;
if ((!tree->left && !tree->right) && ((x % 2 == 0 && tree->label % 2 ==
1) || (x % 2 == 1 && tree->label % 2 == 0)))
return 1;
return counter(tree->left, tree->label) + counter(tree->right, tree-
>label);
}
void updateNode(node*tree) {
if (!tree)
return;
tree->L = counter(tree, 0);
if (!tree->right && !tree->left)
tree->L = 0;
updateNode(tree->left);
updateNode(tree->right);
}
それが動作する、です。
"カウンタ"は、カウントされる葉の数をカウントします。
"UpdateNode"は "counter"を使用して、各サブツリーのリーフ数をカウントし、L(これは構造体で定義したもの)に格納します。
このように私は別の再帰関数への再帰関数を持っており、私は各ノードを複数回訪れます。
コードを最適化するにはどうすればよいですか?
なぜ複数の出力がありますか?どのようにして2番目の出力(= 2)を見つけましたか? –
出力は各ノードのL値に対応します。 私はツリーのインオーダーコールを使用しました。したがって、ツリー例では、L値の出力は最小のラベルから最大のラベルになります。 たとえば、ラベルが5のノード(最小ラベルを持ち、そのL値が最初に表示される)はリーフであるため、そのL値は0です。ラベルが10のノードは2つのリーフを持ち、は2です。ラベル(ルート)として20のノードには、L値(左側)とL値(右側)の2つのそれぞれが2つあるので、そのL値は3です。 私はコード全体を投稿することができます。 – DumbWrench