二叉树实现C++

问题描述 投票:0回答:2

为了好玩,我一直在尝试用 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){
        ??????
    }
}
c++ binary-tree
2个回答
5
投票

不要盲目插入,请遵循以下逻辑。如果 x.value 小于根值,则尝试向左插入。如果 x.value >= root.value,则转到右侧。重复此逻辑,直到达到 NULL 值。这将是插入元素的正确位置。

你可以翻转逻辑,我只是选择了左侧< because less than kinda makes an arrow to the left. <- :P

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();
}

0
投票

如果要在左右子节点都不为 null 时插入,则可以通过递归移动到树的最左侧节点来插入项目。而且由于您只是以不特定的顺序插入值,因此很难跟踪。在这种情况下,最好实现二叉搜索树。

else if(x->left != NULL && x->right != NULL){
         Insert(value,x->left);
         x-> data  = value;
         x->left = x->right = NULL;
}

最重要的是,插入一个 BASE case 来退出递归。

© www.soinside.com 2019 - 2024. All rights reserved.