繁体   English   中英

尝试树实现

Try tree inplementation

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

尝试制作 tree ,有一些麻烦,首先是打印功能 - 它打印的不是我输入的整数,而是打印随机数;

另一个麻烦它的附加子项 - 它只工作一次;

如果你能帮我完成这项任务,我会很高兴。

并且还给出了一些关于链表、c 和 C++ 树的好文章;


#include <iostream>

#include <stdio.h>

using namespace std;


struct Node
{
    void* m_pPayload;
    Node* m_pParent;
    Node* m_Children;
    
};

struct Person
{
    int m_Id;
};

//typedef bool (*NodeComparator)(void* pValue, void* pPayload);

/*bool Comp(void* pValue, void* pPayload)
{
    Person* pVal = (Person*)pValue;
    Person* pPay = (Person*)pPayload;
    if (pVal->m_Id == pPay->m_Id)
        return true;
    else
        return false;
}
*/

Node* NewNode(void* pPayload)
{
    Node* pNode = new Node;
    pNode->m_pParent = nullptr;
    pNode->m_Children = 0;
    pNode->m_pPayload = pPayload;
    return pNode;
}

Person* NewPerson(int id)
{
    Person* p = new Person;
    p->m_Id = id;
    return p;
}

//Node* FindNode(Node* pParent, Node* m_pPayload, NodeComparator comparator);

void AppendChild(Node* pParent, Node* pNode)
{
    if (pParent->m_Children == NULL)
        pParent->m_Children = pNode;
    
}

void print(Node* head) 
{
    Node* current_node = head;
    while (current_node != NULL) 
    {
        printf("%d\n ", current_node->m_pPayload);
        current_node = current_node->m_Children;
        
    }
}


int main()
{

    Node* T = new Node;
    
    T = NewNode(NewPerson(5));
    
    AppendChild(T, NewNode(NewPerson(11)));
    AppendChild(T, NewNode(NewPerson(15)));
    
    print(T);
    
}


4 个回复
printf("%d\n ", current_node->m_pPayload)

不正确。 %d想要一个整数,它被赋予一个指针。 结果将是不寻常的,并且可能看起来是随机的垃圾。

printf("%d\n ", ((Person*)current_node->m_pPayload)->m_Id);
                  ^                                ^
                  |                                Get id from Person
                  treat payload pointer as pointer to Person
                

将解决眼前的问题。

您的代码实际上似乎被很多事情搞得一团糟,在这里分享我几年前自己评论过的代码,希望对您有所帮助

#include <bits/stdc++.h>
using namespace std;

// Single node representation
struct node {
    int data;
    node *left, *right;
};

// Declaring temp for refference and root to hold  root node
node *root, *temp;

// This function only generates a node and return it to the calling function with data stored in it
node* generateNode(int data){
    temp = new node();
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}

// This function actually adds node to the tree
node* addNode(int data, node *ptr = root){
    // If the node passed as ptr is NULL
    if(ptr == NULL){
        ptr = generateNode(data);
        return ptr;
    }
    // Condition to check in which side the data will fit in the tree
    else if(ptr->data < data)
        //if its in right, calling this function recursively, with the right part of the tree as the root tree
        ptr->right = addNode(data, ptr->right);
    else
    //In case the data fits in left
        ptr->left = addNode(data, ptr->left);

    //Note: if there is no data in left or roght depending on the data's valid position, this function will get called with NULL as second argument and then the first condition will get triggered

    //returning the tree after appending the child
    return ptr;
}

//Driver function
int main ()
{
    int c, data;
    for (;;){
        cin >> c;
        switch(c){
            case 1:
                cout << "enter data: ";
                cin >> data;
        //Updating root as the tree returned by the addNode function after adding a node
                root = addNode(data);
                break;
            default:
                exit(0);
                break;
        }
    }
        return 0;
}

首先用于打印节点值

谈论您在上面的代码中犯下的当前错误是:

  1. 你没有提到它指向它的孩子的指针(特别是右或左)。 因此,它每次都显示垃圾值。
    例如: print( node->left);

  2. 由于您需要正确键入 caste 以显示数据的数据。
    例如: printf("%d\\n ", ((Person*)current_node->m_pPayload)->m_Id);

要打印数据有一个特定的方向。 对于树,可以打印节点数据的方向有以下三个:

  • 左序或中序遍历
  • 前序遍历
  • 后序遍历

可以为您提供有关遍历的更好信息。

其次用于将节点添加到树中
可能有助于更好地解释它。

请在下面找到一段可以轻松入门的代码。 它编译并使用递归遍历树。

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;


struct Node
{
    int m_Id;
    vector<Node*> m_Children;
    
    Node(const int& id){
       m_Id = id;   
    }
    
    void AppendChild(Node* pNode) {
        m_Children.push_back(pNode);
    }
    
    void Print() {
        printf("%d\n ", m_Id);
    }
    
};

void traverse(Node* head) 
{
    Node* current_node = head;
    current_node->Print();
    for(int i = 0; i<current_node->m_Children.size(); i++) {
        traverse(current_node->m_Children[i]);
    }
}


int main()
{
    Node* T0 = new Node(0);
    
    Node* T10 = new Node(10);
    T10->AppendChild(new Node(20));
    
    Node* T11 = new Node(11);
    
    Node* T12 = new Node(12);
    Node* T22 = new Node(22);
    
    T22->AppendChild(new Node(33));
    T12->AppendChild(T22);
    
    T0->AppendChild(T10);
    T0->AppendChild(T11);
    T0->AppendChild(T12);
    
    traverse(T0);
    
}
1 尝试和后缀树实现

我研究过Tries和Suffix Trees,并希望实现相同的功能。 请分享一些链接,我可以从中了解实施的结构和基本概念。 任何好的例子,如果包括在内,都会是一个加分。 在C中实施 ...

2 尝试在AVL树中实现查找

我正在使用此代码https://rosettacode.org/wiki/AVL_tree#C.2B.2B作为AVL树的基础。 默认情况下,该示例使用整数,但是我需要存储字符串。 因此,我修改了代码以进行调试,主要是公开发布根并尝试打印值。 但是问题是打印出来的结果是 而且我 ...

4 我正在尝试使用类在C ++中实现一棵树

我只想实现一个TreeNode类,该类的工作方式类似于树实现的结构节点。 除了在inOrder遍历的开始处包含0的输出之外,其他所有东西都工作正常。 谁能向我解释为什么会这样? 输入: 输出: 编辑: 对于将来访问此问题的人们。 更好的做法表明我们不应该使用 使用名称空间std可 ...

5 在Haskell中难以实现霍夫曼树(用我目前在解决方案上的尝试进行编辑)

我目前在Haskell的勇敢冒险中遇到困难。 我陷入需要递归的问题,并且想知道是否有人会提供一个解决方案的例子。 问题是: 给定一个霍夫曼树和一个比特流,返回一个包含以下内容的对:(1)由这些比特编码的符号字符串(根据霍夫曼树),以及(2)一个布尔值,指示输出流是否包含输入中的每个比特 ...

6 二进制搜索树,尝试实现删除节点方法,指针出现问题

我在stackoverflow上找到了另一个不错的线程,可以将它链接起来, 使用递归从二进制搜索树中删除一个节点 。 这是我从中获取代码的地方,它看起来像这样: 如果我们专注于BinaryNode类下的delete方法,我需要一些帮助来了解指针,我之前已经编写了自己的二进制搜索树,但我 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM