你现在要从头开始实现一个二叉树类,该类除了插入(insert)、查找 (find)和删除(delete)方法外,需要实现 getRandomNode()方法用于返回树中的任意节点。该方法应该以相同的概率选择任意的节点。设计并实现 getRandomNode 方法并解释如何实现其
他方法。
需要注意到此题使用了一种十分有趣的描述方式:面试官并不是简单地说:“请设计一个算法,从二叉树中返回一个随机节点。”此题要求我们从零开始实现一个类。此题如此描述并没有根据,我们或许需要访问数据结构的部分内部元素。
class TreeNode{ public: int data; TreeNode *left; TreeNode *right; int size = 0; TreeNode(int d){ data = d; size = 1; left = NULL; right = NULL; } void insertInOrder(int d){ if(d <= data){ if(left == NULL){ left = new TreeNode(d); }else{ left->insertInOrder(d); } }else { if(right == NULL){ right = new TreeNode(d); }else{ right->insertInOrder(d); } } size++; } TreeNode* find(int d){ if(d == data){ return this; }else if(d < data){ return left != NULL ? left->find(d) : NULL; }else if(d > data){ return right != NULL ? right->find(d) : NULL; } } TreeNode* getRandomNode(){ int leftSize = left == NULL ? 0 : left->size; int index = rand() % size; if(index < leftSize){ return left->getRandomNode(); }else if(index == leftSize){ return this; }else{ return right->getRandomNode(); } } };
class TreeNode{ public: int data; TreeNode *left; TreeNode *right; int size = 0; TreeNode(int d){ data = d; size = 1; left = NULL; right = NULL; } TreeNode* getIthNode(int i){ int leftSize = left == NULL ? 0 : left->size; if(i < leftSize){ return left->getIthNode(i); }else if(i == leftSize){ return this; }else{ return right->getIthNode(i-(leftSize + 1)); } } void insertInOrder(int d){ if(d <= data){ if(left == NULL){ left = new TreeNode(d); }else{ left->insertInOrder(d); } }else { if(right == NULL){ right = new TreeNode(d); }else{ right->insertInOrder(d); } } size++; } TreeNode* find(int d){ if(d == data){ return this; }else if(d < data){ return left != NULL ? left->find(d) : NULL; }else if(d > data){ return right != NULL ? right->find(d) : NULL; } } }; class Tree{ public: TreeNode *root = NULL; int size(){return root == NULL ? 0 : root->size;} TreeNode *getRandomNode(){ if(root == NULL) return NULL; int i = rand() % size(); return root->getIthNode(i); } void insertInOrder(int value){ if(root == NULL){ root = new TreeNode(value); }else{ root->insertInOrder(value); } } };