C++;二叉树编程新节点离开作用域问题 我是一个java程序员,教自己C++。p>

C++;二叉树编程新节点离开作用域问题 我是一个java程序员,教自己C++。p>,c++,binary-tree,C++,Binary Tree,在编写二叉树时,我发现我的程序没有向树中“添加”值 #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

在编写二叉树时,我发现我的程序没有向树中“添加”值

#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) {};
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
类二叉树{
结构节点{
公众:
int-val;
节点*左;
节点*右;
Node::Node(intv){
val=v;
左=空PTR;
右=空PTR;
}
};
公众:
二叉树(){
root=nullptr;
}
int size=0;
int length();
bool二进制树::add(intv);
void printree();
私人:
无效打印树(节点*n);
节点*根;
};
bool二进制树::添加(intv){
if(root==nullptr){
根=新节点(v);
++大小;
返回true;
}
节点*ref=根;
库特瓦尔;
while(ref!=nullptr){
如果(vval){
ref=ref->left;
}
否则如果(v>ref->val){
ref=ref->right;
}
否则如果(v==ref->val){
返回false;
}
}
节点*newNode=新节点(v);
ref=新节点;
++大小;
返回true;
}
void BinaryTree::printTree(){
打印树(根);
}
void BinaryTree::printTree(节点*n){
如果(n==nullptr){
返回;
}
打印树(n->左);
cout val(右);
}
int BinaryTree::length(){
返回大小;
}
真空总管(内部一){
BinaryTree=BinaryTree();
添加(6);
树。添加(3);
树。添加(5);
添加(7);
树。添加(1);
树。添加(0);
树。添加(0);
printTree();

cout要将节点添加到树中,必须将其链接到某个现有节点,如中所示

    existing_node->{left or right} = new_node;
一旦
ref
变为null ptr,您就不再有有效的现有节点,现在做任何事情都为时已晚。相反,只要
ref->{left or right}
有效,就遍历树:

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

    // etc for v > ref->val
if(vval){
如果(参考->左){
ref=ref->left;
}否则{
ref->left=newNode;
返回true;
}
}
//用于v>ref->val的etc

我是一个java程序员,教C++ C++,这不是正确的签名,代码< > main < /Calp>函数:<代码>空格main(int i)< /> >你不打算通过使用java作为模型猜测什么是正确的来学习C++。
使用
ref
。您需要一个
节点
构造函数,它接受一个
节点*
和一个
bool
来表示它是左还是右。这是一个很好的二叉树示例这里的主要问题是add方法。ref最终应该找到一个具有相同值的节点(并返回false)或者找到一个NulLPtR节点,在这种情况下它变成一个新的节点。这是典型的java编程,虽然我不知道它为什么不能在C++中工作。是的,我知道C++是非常不同的,我不应该用java作为模板,但是这个具体的例子中什么是错误的?<代码> bool BinaryTree::
在类定义中似乎不正确。
else if(v==ref->val)
应该是
else
。。