Tay*_*lor 9 c++ tree binary-tree insert binary-search-tree
我最近完成了为我正在开发的项目实现二进制搜索树.它进展顺利,我学到了很多东西.但是,现在我需要实现一个常规的二进制树...由于某种原因我难以理解.
我正在寻找一种方法来做我的InsertNode函数..
通常在BST中,您只需检查数据<root然后插入左侧,反之亦然.但是,在普通的二进制树中,它只是从左到右填充,一次一个级别.
任何人都可以帮我实现一个函数,只是从左到右添加一个新的节点没有特定的顺序?
这是我的BST插入:
void Insert(Node *& root, int data)
{
if(root == nullptr)
{
Node * NN = new Node;
root = NN;
}
else
{
if(data < root->data)
{
Insert(root->left, data);
}
else
{
Insert(root->right, data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
bkn*_*per 13
我知道这是前一段时间发布的一个问题,但我仍想分享我对此的看法.
我会做什么(因为这确实没有很好地记录)是使用广度优先搜索(使用队列)并将孩子插入我遇到的第一个空.这将确保您的树在进入另一个级别之前先填充级别.使用正确数量的节点,它将始终完整.
我没有用c ++工作那么多,所以为了确保它是正确的我用Java做了,但你明白了:
public void insert(Node node) {
if(root == null) {
root = node;
return;
}
/* insert using Breadth-first-search (queue to the rescue!) */
Queue<Node> queue = new LinkedList<Node>();
queue.offer(root);
while(true) {
Node n = queue.remove();
if(!n.visited) System.out.println(n.data);
n.visited = true;
if(n.left == null) {
n.left = node;
break;
} else {
queue.offer(n.left);
}
if(n.right == null) {
n.right = node;
break;
} else {
queue.offer(n.right);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Javascript 实现(为您的 Web 控制台准备好复制粘贴):
ES6 实现(带有 class 关键字的较新的 javscript 语法)
class BinaryTree {
constructor(value){
this.root = value;
this.left = null;
this.right = null;
}
insert(value){
var queue = [];
queue.push(this); //push the root
while(true){
var node = queue.pop();
if(node.left === null){
node.left = new BinaryTree(value);
return;
} else {
queue.unshift(node.left)
}
if(node.right === null){
node.right = new BinaryTree(value);
return;
} else {
queue.unshift(node.right)
}
}
}
}
var myBinaryTree = new BinaryTree(5);
myBinaryTree.insert(4);
myBinaryTree.insert(3);
myBinaryTree.insert(2);
myBinaryTree.insert(1);
5
/ \
4 3
/ \ (next insertions here)
2 1
Run Code Online (Sandbox Code Playgroud)
伪经典模式实现
var BinaryTree = function(value){
this.root = value;
this.left = null;
this.right = null;
}
BinaryTree.prototype.insert = function(value){
//same logic as before
}
Run Code Online (Sandbox Code Playgroud)
如果您知道这意味着什么,您应该尝试使用递归方法,例如 x = new (x)。这样,您实际上不必担心根节点。我将为你写一些伪代码:
//public function
add(data){
root = add(data, root)
}
//private helper function
Node add(data, currentNode){
if(currentNode = 0)
return new Node(data)
if(data less than currentNode's data)
currentNode.left = add(data, currentNode.left)
if(data more than currentNode's data)
currentNode.right = add(data, currentNode.right)
return currentNode
}
Run Code Online (Sandbox Code Playgroud)
我制作了一个关于用 C++ 实现 BST 的教程,在这里