Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm AVL二叉搜索树中按高度排序的节点列表_Algorithm_Sorting_Binary Tree_Binary Search Tree_Avl Tree - Fatal编程技术网

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

Algorithm AVL二叉搜索树中按高度排序的节点列表,algorithm,sorting,binary-tree,binary-search-tree,avl-tree,Algorithm,Sorting,Binary Tree,Binary Search Tree,Avl Tree,在AVL树中获得按高度排序的节点列表的最佳方法(计算)是什么? 例如,使用如下AVL: 输出应为: [A,C,G,O,B,N,H,D] (如果存在高度相同的节点,则无论顺序如何)您可以执行以下任一操作:按顺序、按顺序或按顺序遍历,并计算每个节点的高度。但是对于这个问题,我们在数据结构中插入的节点与邻接列表非常相似,唯一的区别是链表位于位置0存储高度为0的所有节点,位置1处的链表存储高度为1的所有节点,依此类推 为了获得输出,我们可以简单地从第一个链表开始打印每个链表中的元素 以下简单伪代码执行

在AVL树中获得按高度排序的节点列表的最佳方法(计算)是什么? 例如,使用如下AVL:

输出应为:

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


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

您可以执行以下任一操作:
按顺序
按顺序
按顺序
遍历,并计算每个节点的高度。但是对于这个问题,我们在数据结构中插入的节点与
邻接列表
非常相似,唯一的区别是
链表
位于
位置0
存储高度为0的所有节点,
位置1处的
链表
存储高度为1的所有节点,依此类推

为了获得输出,我们可以简单地从第一个
链表开始打印每个链表中的元素

以下简单伪代码执行此任务:

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);
 }  
}

现在,我们可以简单地遍历所有的
链表
,从第一个
链表开始
,并按其高度的升序获取节点。

O
出现在
H
之前时,您列出的输出是以什么方式“排序的”,但是在米哈尔富卡拉基斯之后,我开始想知道同样的事情,但后来我意识到他们确实是正确的。节点的高度定义为其子节点的最大深度。A、 C、G和O的高度为0。B和N的高度为1,H的高度为2,D的高度为3。呃,不管什么原因,我把“高度”和“深度”混淆了,谢谢@EmilVikström@MichaelFoukarakis我也是,我现在的日常工作就是和树打交道。几小时前,我甚至还编写了一个getHeight函数。使用BFS从树叶开始遍历树。使用每个节点的平衡指示器。这将起作用,但需要具有固定时间搜索的
邻接列表
的数据结构。我认为你的方法过于复杂。@EmilVikström假设在给定的OP树中没有节点A和C,那么节点B和O的高度都为0。但是它们的水平是不同的,B的水平变为1,O的水平变为3。因为BFS逐级遍历树,所以BFS不会同时打印B和O。@EmilVikström这两个节点将被数据结构R中的第2级节点分隔。这不会创建一个不平衡的AVL树吗?但无论如何,你似乎是正确的,我的算法会给出错误的输出。我想知道你是否可以使用平衡属性来调整BFS方法?