在二叉树中插入/查找问题

时间:2017-01-11 14:56:26

标签: c++ data-structures tree binary-tree binary-search-tree

更新:仅当我将二叉树用于字符串时才会出现此问题。如果我用int来感觉它,一切正常!

几个月前,我用C ++编写了一个二叉树实现。一切似乎工作正常(插入,删除,遍历,找到......),我通过了我的考试:)但是现在当我基于这个二叉树类编写一个新类时,find方法似乎有些错误,但我可以&找不到原因。

以下是问题:find返回指向节点的指针,但由于某种原因,只有当此节点为root时才能访问其成员变量。我不太明白为什么。与poiters有关?或者我的插入功能有问题吗?有人可以帮助我,因为我觉得有点迷失:)

这是我的二叉树界面:

template <class N>
class Node {
public:
  N data;
  Node* left;
  Node* right;
  Node* parent;
};

template <class B>
class BinaryTree {
protected:
  Node<B>* m_root;
  unsigned int m_height;  // longest path in tree
  unsigned int m_size;    // total number of nodes

  // methods that support public methods of below
  void __insert(Node<B>* element, B value);
  void __inorder(Node<B>* element);
  void __preorder(Node<B>* element);
  void __postorder(Node<B>* element);
  void __remove(Node<B>* element, B value);
  void __update_parent(Node<B> *element);
  void __destroy_tree(Node<B>* element);
  int __get_height(Node<B>* element);
  Node<B>* __find(Node<B>* element, B value);
  Node<B>* __find_minimal(Node<B> *element);

public:
  BinaryTree(); // Default constructor
  ~BinaryTree(); // Default deconstructor
  void insert(B value);
  void inorder();
  void preorder();
  void postorder();
  void remove(B value);
  int get_size();
  int get_height();
  bool is_empty();
  bool find(B value);
  bool check_find(B value);
};

插入:

template <class B>
void BinaryTree<B>::insert(B value) {      // Creates a new node in the tree with value
  if(m_root == NULL) {
    m_root = new Node<B>;   // creating the root if it's empty
    m_root->data = value;
    m_root->left = NULL;
    m_root->right = NULL;
    m_root->parent = NULL;
  }
  else {
    Node<B>* element = m_root;
    __insert(element, value);
  }
}

template <class B>
void BinaryTree<B>::__insert(Node<B>* element, B value) {
  if(value < element->data) {
    if(element->left != NULL)
      __insert(element->left, value);
    else {
      element = element->left;
      element = new Node<B>;
      element->data = value;
      element->left = NULL;
      element->right = NULL;
      element->parent = element;
      m_size++;
    }
  }
  else if(value >= element->data) {
    if(element->right != NULL)
      __insert(element->right, value);
    else {
        element = element->right;
        element = new Node<B>;
        element->data = value;
        element->left = NULL;
        element->right = NULL;
        element->parent = element;
        m_size++;
    }
  }
}

查找

template <class B>
Node<B>* BinaryTree<B>::__find(Node<B>* element, B value) {
  if(element != NULL) {
    if(value == element->data)
      return element;
    else if(value < element->data)
      __find(element->left, value);
    else if(value > element->data)
      __find(element->right, value);
  }
  else
    return NULL;
}

最后,测试查找的函数。即使值匹配,当找到的节点为m_root时,它仅返回True。为什么呢?

template <class B>
bool BinaryTree<B>::check_find(B value) {
  Node<B>* node = __find(m_root, value);
  if(node != NULL && node->data == value)
    return true;
  return false;
}

为什么?

更多链接: 我的二叉树实现的完整代码: https://github.com/vgratian/CS-121-Data-Structures/tree/master/graphs 我使用这个二叉树的程序: https://github.com/vgratian/rate-ur-prof

2 个答案:

答案 0 :(得分:0)

在插入函数中,

实际上并没有将元素插入树中。 您创建一个新节点,并将其父级设置为指向自身。另外,您没有将父左/右指针更新为新节点。

看看添加的评论:

if(element->left != NULL)
  __insert(element->left, value);
else { // meaning element->left == NULL
  element = element->left; // element = NULL
  element = new Node<B>; // element = new node
  element->data = value;
  element->left = NULL;
  element->right = NULL;
  element->parent = element; // element->parent = new node.element parent point to himself

答案 1 :(得分:0)

问题在于您的find实现:

else if(value < element->data)
  __find(element->left, value);
else if(value > element->data)
  __find(element->right, value);

这仅适用于定义关系运算符<>的类型/类(以相关方式)。因此,如果Bstd::string,则无效。

对于字符串匹配,请考虑使用Trie