创建一个二叉搜索树的doubleTree()

Creating a doubleTree() of a Binary Search Tree?

本文关键字:搜索树 doubleTree 一个 创建      更新时间:2023-10-16

我遇到了一个问题:

 For each node in a binary search tree, 
 create a new duplicate node, and insert 
 the duplicate as the left child of the original node. 
 The resulting tree should still be a binary search tree.
http://cslibrary.stanford.edu/110/BinaryTrees.html

有一个解决方案,但我的解决方案不同。

void doubleTree(struct node* node) { 
  struct node* tempNode;
  if (node->left == NULL) 
  {
   node->left = new Node(node->data);   
  }
  else{
   tempNode = new Node(node->data);
tempNode->left = node->left;
node->left = tempNode; 
  }
}

这个方法正确吗?谢谢。

方法是正确的,但是,您的doubleTree()不关心问题语句中的单词each。它只复制一个节点

Not不正确。您的代码只向树添加一个节点。因此,它不会使树中的节点翻倍,除非该树恰好只有一个节点。

顺便说一句,我希望在做任何事情之前解决打印树的问题。如果你不能打印一棵树,你怎么能检查其他问题的解决方案是正确的呢?

void createDoubleTree(TreeNode t) {
        if (t == null) {
            return;
        }
        createDoubleTree(t.left);
        TreeNode temp=t.left;
        t.left=new TreeNode(t.k);
        t.left.left=temp;
        createDoubleTree(t.right);
    }
void doubleTree() // public member function of BST class
{
    doubleTree(root);
}
void doubleTree(BSTNode* s) // private member function of BST class
{
    if(s)
    {
        doubleTree(s->left);
        doubleTree(s->right);
        BSTNode *t = new BSTNode;
        t->data = s->data;
        t->left = s->left;
        t->right = 0;
        s->left = t;
    }
}

GDB场景:假设您被一家领先的软件公司聘为软件工程师,并分配了一项任务,根据员工姓名的字母顺序存储员工的记录。您的应用程序应该允许按名称插入、删除和搜索记录。公司主要关心的是对员工的记录进行有效的搜索,以检查员工的绩效。对于这种情况,二进制搜索是一个很好的选择。但是在BST中有一个问题,它不处理重复的值,因为它的正式定义是"如果一个元素大于它的根,它将在它的右边;如果它小于它的根,它就会向左移动。"这个定义不处理重复的值。但是,在给定的场景中,由于多个员工可能具有相同的名称,因此您的BST也应该能够处理重复的值。现在考虑一下,您有以下选项来更改BST定义以容纳重复的值:如果一个元素大于根元素,它将被放到右边,如果它小于根元素,它将被放到左边;否则,它可能会出现在根的右侧或左侧。对每个节点使用一个数组来存储重复的条目。

GDB问题:您的任务是分析在给定场景中使用上述BST定义中关于时间和内存的拟议更改的成本和收益。