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)etc时,我在代码中使用了"new",因为这样可以防止新Node在离开作用域后被销毁。

如果有人能在这个问题上启发我,我将不胜感激。

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

    existing_node->{left or right} = new_node;

一旦ref变成nullptr,就不再有有效的现有节点,而且做任何事情都为时已晚。相反,只要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

最新更新