二叉树实现C++
Binary Tree Implementation C++
我一直在尝试在C++中实现一个二叉搜索树,以获得乐趣。我问题是我的插入功能有问题。以下是我到目前为止所拥有的:
页眉
class TreeNode{
public:
int data;
TreeNode *left;
TreeNode *right;
void Insert(int value, TreeNode *x);
void TreeNode::Print(TreeNode *x);
TreeNode();
};
TreeNode::TreeNode(){
left = NULL;
right = NULL;
}
源
void TreeNode::Insert(int value, TreeNode *x){
if(x->left == NULL && x->right == NULL){
TreeNode *tree = new TreeNode();
tree->datavalue;
x->left = tree;
}
else if(x->left == NULL && x->right != NULL){
TreeNode *tree = new TreeNode();
tree->data = value;
x->left = tree;
}
else if(x->left != NULL && x->right == NULL){
TreeNode *tree = new TreeNode();
tree->data = value;
x->right = tree;
}
else if(x->left != NULL && x->right != NULL){
??????
}
}
您不应该盲目插入,请遵循以下逻辑。如果 x.value 小于根值,请尝试向左插入。如果 x.value 为>= root.value,请转到右侧。重复此逻辑,直到达到 NULL 值。这将是插入元素的正确位置。
你可以颠倒逻辑,我只是选择了左边<因为不到一点向左箭头。>
TreeNode *root = this;
TreeNode *parent = root;
//Traverse the tree, go left if x.val < , else go right(>=)
while(root) {
parent = root;
root = (root->value > x.value) ? root->left : root->right;
}
if(parent->value > x->value)
parent->left = x;
else
parent->right = x;
如果您不关心排序,请使用队列进行深度优先搜索。
queue<TreeNode*> nodes;
nodes.push(this);
while(1)
{
if(!nodes.front()->left)
{
nodes.front()->left = x;
return;
}
else if (!nodes.front()->right)
{
nodes.front()->right = x;
return;
}
nodes.push(nodes.front()->left);
nodes.push(nodes.front()->right);
nodes.pop();
}
如果要在左子项和右子项都不为 NULL 时插入,则可以通过递归移动到树的最左侧节点来插入该项。而且由于您只是以没有特定顺序插入值,因此很难跟踪。在这种情况下,而是实现二叉搜索树。
else if(x->left != NULL && x->right != NULL){
Insert(value,x->left);
x-> data = value;
x->left = x->right = NULL;
}
最重要的是,插入一个 BASE 案例以退出递归。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的