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