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
。。