AVL二叉搜索树中的节点列表,按其高度排序

时间:2017-04-03 17:39:36

标签: algorithm sorting binary-tree binary-search-tree avl-tree

获取AVL树中按高度排序的节点列表的最佳方法(计算)是什么? 例如,像这样的AVL: Example

输出应为:

[A,C,G,O,B,N,H,D]

(无论是否有相同高度的节点的顺序)

1 个答案:

答案 0 :(得分:0)

您可以执行inorderpostorderpreorder遍历中的任何一项并计算每个节点的高度。但是对于这个问题而不仅仅是计算我们在数据结构中插入的节点与adjacency list非常相似,现在唯一的区别是linked list position 0存储height = 0的所有节点},linked list position 1存储height = 1的所有节点,依此类推。

要获得输出,我们只需从第一个linked list开始打印每个链表的元素。

遵循简单的伪代码完成工作:

void inorderTraversal(NodePointer ptr)
{
 if(ptr == NULL)
  return;
 else
 {

  inorderTraversal(ptr->left);
  if(ptr->left == NULL and ptr->right == NULL)
  {
   ptr->height = 0;
   adjacencyList[ptr->height].append(ptr->value);
  }
  else
  {
   if(ptr->left != NULL and ptr->right == NULL)
   {
    ptr->height = ptr->left->height + 1;
    adjacencyList[ptr->height].append(ptr->value);
   } 
   if(ptr->right != NULL and ptr->left == NULL)
   {
    ptr->height = ptr->right->height + 1;
    adjacencyList[ptr->height].append(ptr->value);
   } 
   if(ptr->right != NULL and ptr->left != NULL)
   {
    h1 = ptr->left->height;
    h2 = ptr->right->height;
    ptr->height = max(h1,h2)
    adjacencyList[ptr->height].append(ptr->value);    
   }    
  }   
  inorderTraversal(ptr->right);
 }  
}

现在我们可以从第一个linked lists开始遍历所有linked list,并按照高度的升序获取节点。