使用c ++在二叉树中进行非递归添加功能

时间:2011-07-09 22:15:51

标签: c++ binary-tree non-recursive

我正在编写一个Add函数,以非递归方式将节点添加到二叉树中。 我遇到的问题是只能生成一级深度二叉树。我调试了它,我知道问题在哪里,但无法弄清楚如何修复它。也许新鲜的眼睛会看到我不会... 问题是我的临时节点在每次新函数调用时都被重置为根值,因此,线性地添加节点。 无论如何,这是功能:

   void BinaryTreeNonRec::add(int num){
        treeNode *temp, *parent;

        if (root==NULL) {
            root = new treeNode;
            root->data=num;
            root->left=0;
            root->right=0;
            temp=root;
            printf("value is root \n");
        } else {
            temp=root;
            while (temp!=NULL) {
                if (num <= temp->data){
                    parent = temp;
                    temp=temp->left;
                    //root =temp;
                    printf("value is to the left \n");
                } else {
                    parent =temp;
                    temp=temp->right;
                    //root=temp;
                    printf("value is to the right \n");
                }               
            }   
            parent = new treeNode;
            parent->data=num;
            parent->left=NULL;
            parent->right=NULL;
            temp=parent;
        }   
}

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:2)

您没有将新节点添加到树中,只是向下运行树并使用新节点填充父节点,但从不将其添加到树中,请更改以下代码:

parent = new treeNode;
parent->data=num;
parent->left=NULL;
parent->right=NULL;
temp=parent;

要:

treeNode *newNode = new treeNode;
newNode->data = num;
newNode->left = NULL;
newNode->right = NULL;

//Now insert the new node BELOW parent
if(num <= parent->data)
    parent->left = newNode;
else
    parent->right = newNode;

答案 1 :(得分:1)

问题可能是您从未将新节点添加到树中。

  parent = new treeNode;
  parent->data=num;
  parent->left=NULL;
  parent->right=NULL;
  temp=parent;

您将新节点分配给temp和parent,它们是临时变量,因此不存在于函数外部。您需要做的是将新节点分配给parent-&gt; left或parent-&gt; right,具体取决于新输入所在的哪一侧,以便将其链接到树中。因此,您想要做的事情如下:

  temp = new treeNode;
  temp->data=num;
  temp->left=NULL;
  temp->right=NULL;
  if(num < parent->data)
     parent->left = temp;
  else
     parent->right = temp;

答案 2 :(得分:0)

<强> ALGO

  1. 如果root == null创建新节点分配给Root
  2. 根据与rootNode的比较继续迭代,直到到达任何叶节点
  3. 检查num&lt; = parent(leaf)是否插入左侧ELSE插入右侧
  4. <强>代码

    private void insertItrInBST(int num){
        Node temp = root,parent = root;
    
        if(root == null){
            root = getNewNode(num);
        }else{
            temp = root;
    
            while(temp != null){
                if(num <= root.data){
                    parent = temp;
                    temp = temp.left;   
                }else{
                    parent = temp;
                    temp = temp.right;
                }
            }
            Node newNode = getNewNode(num);
            if(num <= parent.data){
                parent.left = newNode;
            }else{
                parent.right = newNode;
            }
        }
    }