【问题标题】:List of nodes in a AVL binary search tree, ordered by their heightAVL 二叉搜索树中的节点列表,按高度排序
【发布时间】:2017-04-03 17:39:36
【问题描述】:

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

输出应该是:

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

(如果有相同高度的节点,无论顺序如何)

【问题讨论】:

  • O 出现在H 之前但在G 之后时,您列出的输出以何种方式“排序”?
  • @MichaelFoukarakis 一开始我也想知道同样的事情,但后来我意识到它们确实是正确的。节点的height 定义为其子节点的最大深度。 A、C、G 和 O 的高度 = 0。 B 和 N 的高度为 1,H 的高度为 2,D 的高度为 3。
  • 呃,无论出于何种原因,我将“高度”与“深度”混淆了,谢谢@EmilVikström
  • @MichaelFoukarakis 我也是,我的日常工作中现在正在处理树木。我什至在几个小时前写了一个 getHeight 函数。
  • 使用 BFS 从叶子向上遍历树。利用每个节点的余额指标。

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


【解决方案1】:

您可以执行任何inorderpostorderpreorder 遍历并计算每个节点的高度。但是对于这个问题而不是仅仅计算我们在数据结构中插入与adjacency list非常相似的节点,唯一的区别是现在linked listposition 0存储所有具有height = 0的节点,linked list@987654330 @存储所有带有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 list开始遍历所有linked lists,并按高度升序获取节点。

【讨论】:

  • 这可以工作,但需要adjacencyList 的数据结构和恒定时间搜索。我认为您的方法过于复杂。
  • @EmilVikström 假设在给定的 OP 树中,没有节点 A 和 C。那么节点 B 和 O 的高度均为 0。但它们的级别不同。
  • @EmilVikström B 的级别变为 1,O 的级别为 3。由于 BFS 逐级遍历树,因此 bfs 不会同时打印 B 和 O。
  • @EmilVikström 这两个节点将由数据结构 R 中的第 2 级节点分隔。
  • 这不会创建不平衡的 AVL 树吗?但无论如何你似乎是正确的,this balanced AVL tree 会用我的算法给出不正确的输出。不过,我想知道您是否可以使用平衡属性来调整 BFS 方法?
猜你喜欢
  • 1970-01-01
  • 2016-01-07
  • 2014-12-21
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多