#ifndef __TREE_H
#define __TREE_H
#include <cstdlib>
#include<string>
// structure of a tree node
struct TreeNode{
string str;
TreeNode *parent;
TreeNode *leftChild;
TreeNode *nextSibling;
TreeNode(string str1){
this->str = str1;
this->parent = NULL;
this->leftChild = NULL;
this->nextSibling = NULL;
}
};
class Tree{
TreeNode* root;
int size;
public:
Tree(); //constructor
void insert(string str1); //insert a node
string locate(string str1); //locate a node
TreeNode *ancestor(string str1, string str2); //get lowest common ancestor
};
#endif
这是一类通用树(不是二叉树)。实现定位功能的最快方法是什么?我应该首先通过所有的孩子,然后是兄弟姐妹还是什么?
答案 0 :(得分:1)
如果树是无序的,除了所有节点的强力测试之外没有其他算法,并且在找到元素(如果找到)时会中断。处理树时,递归通常是最简单的方法。伪算法可能类似于:
find(current_node,value):
if current_node.value == value
return found
else
if find(current_node.left,value) == found
return found
else if find(current_node.right,value) == found
return found
else
return not_found
当然,在真正实现这一点时,您需要测试空指针,依此类推。在树上没有任何其他约束的情况下,渐近复杂度不能降低。您可能会使用非递归方法或尾递归算法(基于上述)来改善常数因子,但不要期望在那里有很大的改进。
答案 1 :(得分:0)
如果节点是有序的,即子节点小于此节点且兄弟节点大于此节点,则与str
进行比较,并根据结果将结果作为结果或搜索子节点或与兄弟姐妹比较
const TreeNode *TreeNode::locate(const string &str1) const
{
int c = str.compare(str1);
if (c == 0)
return this;
if (c > 0) {
if (leftChild)
return leftChild->locate(str1);
return 0;
}
if (nextSibling)
return nextSibling->locate(str1);
return 0;
}
并在树中
const TreeNode *Tree::locate(const string &str1) const
{
return root->locate(str1);
}
答案 2 :(得分:0)
您可以尝试多种树遍历算法,具体取决于您的信息在树节点之间的分布方式。
BFS,DFS,是一些例子。