二叉搜索树,如何将节点连接到root?

时间:2013-12-16 01:57:04

标签: c++ binary-search-tree

#include "stdafx.h"
#include <iostream>
using namespace std;

struct node
{
    int element;
    node *left;
    node *right;
    int height=-1;
};


struct BST
{
    bool isSameRoot=true;
    int hight=0;
    node* root=NULL ;
    void addElement(int n);
    void insert(node* Node,int number);
    void preorder(node* p);

};

void BST::addElement(int n)
{
    insert(root, n);
    cout << "Adding" << endl;
}


void BST::insert(node* p,int n)
{
    if (p == NULL)
    {
        p = new node;
        p->element = n;
        p->left = NULL;
        p->right = NULL;

        if (isSameRoot)// To skip one of the iterations;
        {
            hight++;
        }
        isSameRoot = !isSameRoot;
        p->height = hight;
        cout << "Element is Added:: " << n<<endl;
        cout << "HEIGHT==: " <<p->height<<endl ;
    }
    else
    {
        if (n<p->element)
        {
            insert(p->left, n);
        }
        else if (n>p->element)
        {
            insert(p->right, n);
        }
    }
}

void preorder(node* p)
{
    while (p != NULL)
    {
        cout << p->element << endl;
        preorder(p->left);
        preorder(p->right);
    }
}

int main()
{
    BST* tree=new BST ;

    tree->addElement(8);
    tree->addElement(9);
    tree->addElement(45);
    tree->addElement(25);
    tree->addElement(97);
    tree->addElement(78);

    preorder(tree->root);//Here is the disease;

    return 0;
}

我的问题可能非常基础但很重要;

显然在BST中我们应该将每个节点连接到根节点;

你能看看我的代码并告诉我如何解决这个问题;

preorder()方法之前,一切正常/看起来很好;

我没有使用单根节点;

这是我的问题; 我应该如何将节点连接到根节点;

2 个答案:

答案 0 :(得分:2)

如果您的目标只是逐步生成BST并稍后通过遍历转储其内容,您甚至不需要将节点连接到其父节点或根节点,您似乎也不需要跟踪高度或'高度节点'[sic]。

您的问题是您根本没有构建树。在插入NULL节点时,您只需设置一个指向新节点的临时指针。 C ++按值而不是引用传递参数,因此您认为在BST中设置的'p'只是BST根的临时副本,并且在BST :: insert调用结束时丢失(和泄漏)

那就是说,这里有一些其他建议:

  • 您可以在插入(...)调用中传递(递归递增的)高度索引,而不是将其存储在节点中。
  • 在BST :: addElement(int n)中插入NULL检查/节点而不是BST :: insert(...)调用,因为null情况应该只发生在树的第一个插入上,这无论如何都只能发生在初始的addElement上。
  • isSameRoot变量看起来像是一个不必要的黑客。

编辑:我感到无聊。这是你的作业答案,请你投票并接受我的答案,我可以为我自己的问题使用一些更多的声望奖励......

struct node {
  int   element;
  node *left;
  node *right;
  node(int n = 0) : element(n), left(NULL), right(NULL) { }
};

struct BST{
  node *root = NULL;    
  void addElement(int n);
  void insert(node &Node, int number);
  void preorder(node *p);
};

void BST::addElement(int n) {
  if (!root) { root = new node(n); }
  else       { insert(*root, n); }
}

void BST::insert(node &p, int n) {
  if (n < p.element) {
    if (!p.left)  { p.left = new node(n); }
    else          { insert(*(p.left), n); }
  }
  else if (n > p.element) {
    if (!p.right) { p.right = new node(n); }
    else          { insert(*(p.right), n); }
  }
}

void preorder(node *p) {
  if (!p) { return; }

  cout << p->element << endl;
  preorder(p->left);
  preorder(p->right);
}

答案 1 :(得分:0)

你正在做(p!= NULL) - 卡在无限循环中。 if(p!= null)。