二叉树c语言程序插入某个成员,关于C ++:二叉树:插入节点算法

我正在尝试实现二叉树(如果它是普通的二叉树或二叉搜索树,则不重要),并且我在创建节点并将其链接到树的功能上遇到了一些麻烦。

这是我到目前为止编写的代码:

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只是用于即时尝试。

如果您的编译器中有C ++ 11支持,请使用std::unique_ptr来保存您的Node和表示所有权转让的函数参数,并在要转让所有权时自由使用std::move和reset 当您为其分配new Node时。

我认为您采取了正确的方法,但是没有完成。您的方法可能如下所示:

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;

}

}

}

}

}

这样实现二叉搜索树吧?我看到您检查了数据以决定将节点放置在何处。此外,如果它对您来说不那么乏味,您是否可以添加一些注释(例如,在更嵌套的if中)?

是的,这肯定需要评论。 @Overflowh:树需要一种方法来查找您要查找的数据,并且您没有按索引查找成员,但是您确实有通过二分查找来查找成员,所以,这个答案是二分查找。我想我们可以插入随机的位置,但是祝您好运再次找到数据。除非您有其他找到节点的方法?

@MooingDuck:我以为我可能需要一个在树中查找节点的函数,并且我想实现广度优先的搜索算法(就像我将插入算法弄清楚一样)。

@Overflowh:如果您要进行广度优先搜索...我不认为您知道为什么要首先创建二叉树。几乎没有理由拥有未索引或未排序的二叉树。

@MooingDuck:它是一种练习。今天早上我开始学习二叉树,当然,我不知道很多事情。

@Overflowh:98%的时间中,二叉树是有序的,因此互联网上几乎每个示例都是有序的二叉树。 Id从有序二叉树开始,因为它很容易理解。 1%是索引的二叉树,而1%是匹配的类似二进制的数据。

@MooingDuck:您是说只有1%的索引树对某些真实事物有用吗?或者仅仅是BFS仅需要1%的费用?

实际上,我认为BFS对它们中的任何一个都不有用。对于匹配类二叉树数据的自定义树来说,这很有用。但是我无法想象那会是什么,我从未见过。

@MooingDuck:哦。谢谢你的实用建议。但是,不幸的是,由于练习需要,我仍然必须实施BFS(或者可能存在其他逐级搜索算法)。P.S:对不起,没有得到评论的通知。

@Overflowh:刚刚添加评论

我假设这是某种形式的家庭作业,所以我认为重要的是要强调基础知识,让您弄清楚其余的内容。因为它是任何遍历树的起点,所以Head永远都不应更改,除非您要删除根Node。任何遍历都应该由另一个Node对象完成,该对象可以(并且可能经常)在每次函数调用结束时超出范围,而在程序中没有任何副作用。

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

祝您程序顺利。

因此,我应该以这种方式修改:struct Node { * stuff * } *root, *traversal;?我觉得很奇怪,在树的"填充"期间更改了名为head(或root)的对象。因此,我的createNode函数仅在== 0时才更改*head,而改为*traversal在其他情况下?

这只是我注意到的几件事:

您的头像检查!= null应该先执行,否则请先执行

createNode()将崩溃。所有其他分支应位于" else"中。

您的最后一个(或者我应该先说)新节点(dat,head,head)应该是新节点(dat,0,0)

为了代码清晰和/或作为国际维护程序员赞赏运动的一部分。

您可能想增加treeSize。

否则,您将走上正确的道路。继续。

#2是错误的。这很奇怪,但是由于只有在head == 0时它才到达该分叉,因此new Node(dat, head, head是new Node(dat, 0, 0)。

哇。你是对的。我想知道这是否是故意的;)

似乎不太可能。

@MooingDuck:不好意思。我已经写和删除了很多次。复制/粘贴到功能主体周围,因此它太混乱了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值