该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我以前的代码有实现前序和后序的,中序感觉应该差不多
struct AvlTreeNode* AvlTreeIterateHead(struct AvlTree* tree)
{
struct AvlTreeNode* currentNode = tree->m_rootNode;
if(currentNode != tree->m_nullNode)
{
// find the smallest node
while(currentNode->m_child1 != tree->m_nullNode)
currentNode = currentNode->m_child1;
return currentNode;
}
return NULL;
}
struct AvlTreeNode* AvlTreeIterateTail(struct AvlTree* tree)
{
struct AvlTreeNode* currentNode = tree->m_rootNode;
if(currentNode != tree->m_nullNode)
{
// find the greatest node
while(currentNode->m_child2 != tree->m_nullNode)
currentNode = currentNode->m_child2;
return currentNode;
}
return NULL;
}
struct AvlTreeNode* AvlTreeIterateNext(
struct AvlTree* tree,
struct AvlTreeNode* node)
{
struct AvlTreeNode* currentNode;
if(node->m_child2 != tree->m_nullNode)
{
// look for right child's smallest node
currentNode = node->m_child2;
while(currentNode->m_child1 != tree->m_nullNode)
currentNode = currentNode->m_child1;
return currentNode;
}
else if(node->m_parent != tree->m_nullNode)
{
currentNode = node;
// the node has no right child, look back
while(currentNode != tree->m_rootNode)
if(currentNode->m_parent->m_child2 != currentNode)
return currentNode->m_parent;
else currentNode = currentNode->m_parent;
}
return NULL;
}
struct AvlTreeNode* AvlTreeIteratePrev(
struct AvlTree* tree,
struct AvlTreeNode* node)
{
struct AvlTreeNode* currentNode;
if(node->m_child1 != tree->m_nullNode)
{
currentNode = node->m_child1;
// look for left child's greatest node
while(currentNode->m_child2 != tree->m_nullNode)
currentNode = currentNode->m_child2;
return currentNode;
}
else if(node->m_parent != tree->m_nullNode)
{
currentNode = node;
// the node has no left child, look back
while(currentNode != tree->m_rootNode)
if(currentNode->m_parent->m_child1 != currentNode)
return currentNode->m_parent;
else currentNode = currentNode->m_parent;
}
return NULL;
}