在二叉树中插入元素
Posted
技术标签:
【中文标题】在二叉树中插入元素【英文标题】:Inserting an element in Binary Tree 【发布时间】:2013-04-30 05:30:19 【问题描述】:尝试在网上进行了很多探索,但可以得到任何帮助, 到处都像是在二叉搜索树中添加一个节点。
问题:请求向二叉树添加节点的算法和代码sn-p。 (或指出我正确的网址)
假设: 据我了解,二叉树和二叉搜索树有什么不同?如果我错了,请纠正我。
(请求:如果您正在编写代码 sn-p,请使用正确的变量名,这有助于理解)
例如:二叉树
5 7 3 x1 x2 x3
5
7 3
x1 x2 x3
二叉搜索树 5 7 3 2 4 6
5
3 7
2 4 6
insert(int key, struct node **root)
if( NULL == *root )`
*root = (struct node*) malloc( sizeof( struct node ) );`
(*root)->data = key;
(*root)->left = NULL;
(*root)->right = NULL;
else if(key < (*root)->data)
insert( key, &(*root)->left );
else if(key > (*root)->data)
insert( key, &(*root)->right );
【问题讨论】:
如果你在谈论二叉搜索树并且你正在尝试做一些 instertion,也许这会有所帮助?:en.wikipedia.org/wiki/Binary_search_tree#Insertion 错误的二叉搜索树 @AbdullahShoaib 告诉我 BST 的正确顺序是什么。 @Cleaner :给定链接上的 insertHelper() 还会检查值 key ,因为二叉树不应该打扰值是小还是大。如果下一个节点可用,它应该继续并将下一个节点放在左边,否则放在右边。我希望您了解二叉树和二叉搜索树之间的区别是什么?据此你认为它正确吗。 @wildplasser:是的,它是一个 BST,我正在寻找二叉树.. 没有得到一个算法来做同样的事情 【参考方案1】:二叉树和二叉搜索树的区别在于,尽管它们都有每个节点最多可以有 2 个子节点的限制,但二叉搜索树 (BST) 的左子节点也必须等于或小于value 和它的右孩子必须具有更大或相等的价值。这就是为什么它被称为“搜索”树的原因,因为所有内容都是按数字排序的,并且它的搜索运行时间为 O(logn)。
因为不需要成为 BST,所以可以将二叉树存储在向量(数组)中。当您插入向量时,您会以级别顺序的方式构建二叉树。代码如下:
// typedef the node struct to NODE
// nodeVector similar to STL's vector class
insert(int key, NODE** nodeVector)
NODE *newNode = (NODE*) malloc( sizeof( NODE ) );
newNode->data = key;
newNode->left = NULL;
newNode->right = NULL;
// add newNode to end of vector
int size = nodeVector->size();
nodeVector->push_back(newNode);
// if newNode is not root node
if(nodeVector->size() > 1)
// set parent's child values
Node* parent = (size/2)-1; // take advantage of integer division instead of using floor()
if (parent->left == NULL)
parent->left = newNode;
else
parent->right = newNode;
【讨论】:
感谢@bagel 的澄清。我已经更新了我的 BST 代码以进行插入,请您建议我应该合并哪些更改以使此 BST 成为二叉树 贴出你目前正在使用的代码,我看看我能做什么。 刚刚在问题中提出了它,因为我有点难以将其格式化。请忽略`字符。 当我从 main 调用 insert() 函数时,我的左值应该是多少? @Ravi 你是对的。公平地说,二叉树(或 BST)对平衡没有要求,所以从技术上讲,这并不是不正确的。如果这是您在 BST 中想要的附加要求,请查看 AVL 树。话虽如此,您对我的代码有问题是完全正确的,因为这几乎与链表相同。所以现在,在我接受另外 2 年的教育之后,我将尝试提供一个更理想的解决方案。 :)【参考方案2】:队列数据结构可用于将元素插入二叉树,因为在二叉树中节点的顺序是不被维护的,所以我们会在找到任何空值时立即插入节点。 使用队列,我们将在 Level Order Traversal 中遍历二叉树。
struct Treenode* temp;
Q = CreateQueue();
EnQueue(Q,root);
while(!IsEmptyQueue(Q))
temp = DeQueue(Q);
if(temp->left)
EnQueue(Q,temp->left);
else
temp->left=newNode;
DeleteQueue(Q);
return;
if(temp->right)
EnQueue(Q,temp->right);
else
temp->right=newNode;
DeleteQueue(Q);
return;
【讨论】:
【参考方案3】:因为,我无法评论我正在写这篇文章。 上面对二叉树插入函数的回答是错误的。 假设 0, 1, 2 , 3, 4 , 5 依次传递给插入函数, 它的生成树像
0
/
1
\
2
/
3
\
4
/
5`<br/>
其中的中序遍历将是 1 3 5 4 2 0 而答案应该是
0
/ \
1 2
/ \ /
3 4 5
其中的中序遍历将是 3 1 4 0 5 2。
【讨论】:
你是对的,在通过我的学位再回到这个答案 1.5 年后,我看到了我的错误:)。我会尝试解决这个问题。谢谢 好的,我做了一些改动,你现在有什么想法? @bagelboy:我的代码仍然存在问题。我直接在你的帖子下评论。【参考方案4】:由于我也面临同样的问题,所以我在网上想出了以下解决方案:-
您可以使用队列来存储我们想要放置新节点的当前节点,就像我们在级别顺序遍历中所做的那样,然后我们逐级插入节点。
以下链接可能会对您有所帮助:-
http://www.geeksforgeeks.org/linked-complete-binary-tree-its-creation/
【讨论】:
【参考方案5】:我将其发布为答案,因为我没有必要的声誉来发表评论。除了 bagelboy,所有其他人都将树误解为二叉搜索树或完全二叉树。问题是简单的二叉树,Bagelboy 的答案看起来是正确的。
【讨论】:
以上是关于在二叉树中插入元素的主要内容,如果未能解决你的问题,请参考以下文章