二叉树:插入节点算法

时间:2013-05-31 17:14:54

标签: c++ binary-tree

我正在尝试实现一个二叉树(如果它是一般二叉树或二叉搜索树并不重要),并且我在创建节点并将其链接到树中的函数遇到了一些麻烦。 /> 这是我到目前为止编写的代码:

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只是为了实时尝试。

3 个答案:

答案 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)

以下是我注意到的一些事情:

  1. 你的头部检查!= null应先行,否则先行 createNode()将崩溃。所有其他分支应该在&#34; else&#34;中。

  2. 您的最后一个(或者我应该说是第一个)新节点(dat,head,head)应该是新节点(dat,0,0) 为了清晰的代码和/或作为国际维护程序员感谢活动的一部分。

  3. 您可能想要增加treeSize。
  4. 否则,你走在正确的轨道上。继续。

答案 2 :(得分:1)

我认为这是某种类型的家庭作业,所以我认为强调基础知识并让你弄清楚其余部分是很重要的。由于它是任何遍历树的起点,因此除非您删除根节点,否则Head永远不会更改。任何遍历都应该由另一个Node对象完成,该对象可以(并且可能经常会)在每个函数调用结束时超出范围,而不会在程序中产生任何副作用。

正如已经指出的那样,你需要考虑head = NULL作为第一个条件的情况,然后处理head!= NULL的后续遍历。通过插入,您必须考虑如何进行插入,并正确链接到树的其他元素。记住叶子是右侧和左侧数据成员为NULL的任何Node对象可能会有所帮助。

祝你好运。