我正在尝试实现一个二叉树(如果它是一般二叉树或二叉搜索树并不重要),并且我在创建节点并将其链接到树中的函数遇到了一些麻烦。 /> 这是我到目前为止编写的代码:
class BinaryTree {
class Node {
char data;
Node* leftChild;
Node* rightChild;
Node(char d, Node* lc, Node* rc):
data(d), leftChild(lc), rightChild(rc) {}
} *head;
int treeSize;
public:
BinaryTree(): head(0), treeSize(0) {}
// totally wrong code
void createNode(char dat) {
if (head->data < dat)
head->leftChild = new Node(dat, 0, 0);
if (head->rightChild == 0)
head->rightChild = new Node(dat, 0, 0);
if (head == 0) {
head = new Node(dat, head, head);
}
}
};
好吧,我想使用链表实现二叉树,但在这种情况下,问题是head
指针将指向最后添加的节点之一,而不是指向根。以这种方式使用链表的另一个问题可能是查找节点的空子节点。添加新节点。
有人可以帮助我,也许可以建议一种更好的方法来实现二叉树?
注意:我打算将这个类设为template
,char只是为了实时尝试。
答案 0 :(得分:3)
我认为你采取了正确的方式,但没有完成它。您的方法可能如下所示:
void addNode( char data ) {
// when root is uninitialized
if ( NULL == head ) {
head = new Node( data, NULL, NULL );
} else {
Node *currentNode = head;
// search for the place to insert the new value
while ( true ) {
if ( currentNode->data < data ) {
// if the current node already has left child
// so we concern it further
if ( NULL != currentNode->leftChild ) {
currentNode = currentNode->leftChild;
continue;
// if the current node has no left child
// so we create it with the new value
} else {
currentNode->leftChild = new Node( data, NULL, NULL );
return;
}
} else {
// similarly for the value that should be inserted into
// right subtree
if ( NULL != currentNode->rightChild ) {
currentNode = currentNode->rightChild;
continue;
} else {
currentNode->rightChild = new Node( data, NULL, NULL );
return;
}
}
}
}
}
答案 1 :(得分:1)
以下是我注意到的一些事情:
你的头部检查!= null应先行,否则先行 createNode()将崩溃。所有其他分支应该在&#34; else&#34;中。
您的最后一个(或者我应该说是第一个)新节点(dat,head,head)应该是新节点(dat,0,0) 为了清晰的代码和/或作为国际维护程序员感谢活动的一部分。
否则,你走在正确的轨道上。继续。
答案 2 :(得分:1)
我认为这是某种类型的家庭作业,所以我认为强调基础知识并让你弄清楚其余部分是很重要的。由于它是任何遍历树的起点,因此除非您删除根节点,否则Head永远不会更改。任何遍历都应该由另一个Node对象完成,该对象可以(并且可能经常会)在每个函数调用结束时超出范围,而不会在程序中产生任何副作用。
正如已经指出的那样,你需要考虑head = NULL作为第一个条件的情况,然后处理head!= NULL的后续遍历。通过插入,您必须考虑如何进行插入,并正确链接到树的其他元素。记住叶子是右侧和左侧数据成员为NULL的任何Node对象可能会有所帮助。
祝你好运。