2016-08-02 11 views
1

私は自分自身をC++に教えるJavaプログラマです。C++バイナリツリースコープの問題を残す新しいノードのプログラミング

バイナリツリーを作成しているうちに、自分のプログラムがツリーに値を「追加」していないことがわかりました。

#include "stdafx.h" 
#include <cstdlib> 
#include <iostream> 
using namespace std; 
class BinaryTree { 

    struct Node { 
    public: 
     int val; 
     Node* left; 
     Node* right; 
     Node::Node(int v) { 
      val = v; 
      left = nullptr; 
      right = nullptr; 
     } 
    }; 
public: 
    BinaryTree() { 
     root = nullptr; 
    } 

    int size = 0; 
    int length(); 
    bool BinaryTree::add(int v); 
    void printTree(); 
private: 
    void printTree(Node* n); 
    Node* root; 

}; 
bool BinaryTree::add(int v) { 

    if (root == nullptr) { 
     root = new Node(v); 
     ++size; 
     return true; 
    } 
    Node* ref = root; 
    cout << ref->val; 
    while (ref != nullptr) { 
     if (v < ref->val) { 
      ref = ref->left; 
     } 
     else if (v > ref->val) { 
      ref = ref->right; 
     } 
     else if (v == ref->val) { 
      return false; 
     } 
    } 
    Node *newNode = new Node(v); 
    ref = newNode; 
    ++size; 
    return true; 
} 
void BinaryTree::printTree() { 
    printTree(root); 
} 
void BinaryTree::printTree(Node* n) { 
    if (n == nullptr) { 
     return; 
    } 
    printTree(n->left); 
    cout << n->val << endl; 
    printTree(n->right); 
} 
int BinaryTree::length() { 
    return size; 
} 
void main(int i) { 
    BinaryTree tree = BinaryTree(); 
    tree.add(6); 
    tree.add(3); 
    tree.add(5); 
    tree.add(7); 
    tree.add(1); 
    tree.add(0); 
    tree.add(0); 

    tree.printTree(); 
    cout << "binary tree sz is " << tree.length() << endl; 
    while (true) {}; 
} 

なぜ、ツリーがルート以外の新しいノードをコミットしないのかに関する問題を見つけることができませんでした。

これは、新しいノードがスコープを離れると破棄されるのを防ぐため、addsメソッドに(ref = new Node)などを書き込むときにコードで "new"を使用しました。

誰でもこの問題を私に教えてもらえると大変感謝しています。

+1

*私はC++ *自分自身を教えるJavaプログラマ午前:代わりに、限り有効ですref->{left or right}としてツリーをトラバース' - Javaをモデルに使って何が正しいのかを推測することで、C++を学ぶつもりはありません。 – PaulMcKenzie

+0

ここでの問題は、 '新しいノード(v)'と 'ref'をリンクしていないことです。左か右かを示す 'Node *'と 'bool'を取る' Node'コンストラクタが必要です。 – GreatAndPowerfulOz

+0

[Here](http://www.cplusplus.com/forum/general/1551/)は良いバイナリツリーの例です – GreatAndPowerfulOz

答えて

2

refがnullptrなると

existing_node->{left or right} = new_node; 

で、あなたはもはや有効な既存のノードを持っていない、そしてそれはあまりにもあるように、あなたには、いくつかの既存のノードにリンクする必要がツリーにノードを追加するには遅く何かをする。 `無効メイン(I int型): - これは` main`機能の正しい署名ではありません

if (v < ref->val) { 
     if (ref->left) { 
      ref = ref->left; 
     } else { 
      ref->left = newNode; 
      return true; 
     } 
    } 

    // etc for v > ref->val 
関連する問題