如何打印二叉树图(垂直)并确保不正确打印相当不平衡的树?
How to print a Binary Tree diagram (vertical) and ensure fairly unbalanced trees are not improperly printed?
我正在尝试编写打印垂直二叉树图的功能,
我已经编写了正确的广度优先搜索算法,它将 BFS 有序树遍历输出为整数向量。代码如下:
void bst::printlist(Node* node)
{
std::queue<Node*> travQueue;
std::vector<int> result;
travQueue.push(node);
while (!travQueue.empty())
{
result.push_back(node->val);
if (node->prev != NULL)
{
travQueue.push(node->prev);
}
if (node->next != NULL)
{
travQueue.push(node->next);
}
travQueue.pop();
node = travQueue.front();
}
}
但是,我完全不知道如何将结果向量转换为准确表示所有缺失节点的向量,这些节点在相当不平衡的树中作为间隙存在,
对于这个例子,当它需要包含每个缺失节点的信息一直到底层时,向量将只用从左到右的顺序填充整数。在编写实际代码以使用 ASCII 字符打印树时,如果我能够确定在何处绘制节点以及在何处不绘制节点,我将需要此信息——因此,我计划在这些间隙处包含虚拟值以区分。
有人对解决这个问题的方法有什么建议吗?
谢谢!
这是一个很好的答案,感谢@NicoSchertler:
“您可以将 prev 和 next 推送到 travQueue,即使它们是 nullptr。当您在迭代中到达 nullptr 时,将虚拟值添加到结果中,并将另外两个 nullptr 添加到 travQueue 以用于不存在的子项。”
这是我的代码:
std::queue<Node*> travQueue;
std::vector<int> result;
int h = treeheight(root) + 1;
travQueue.push(node);
for (int i = 0; i < pow(2, h) - 1; i++)
{
node = travQueue.front();
if (node != nullptr)
{
if (node->prev != nullptr)
{
travQueue.push(node->prev);
} else
{
travQueue.push(nullptr);
}
if (node->next != nullptr)
{
travQueue.push(node->next);
} else
{
travQueue.push(nullptr);
}
} else
{
travQueue.push(nullptr);
travQueue.push(nullptr);
}
if (node != nullptr)
{
result.push_back(node->val);
} else
{
result.push_back(-1);
}
travQueue.pop();
}
return result;
我正在尝试编写打印垂直二叉树图的功能,
我已经编写了正确的广度优先搜索算法,它将 BFS 有序树遍历输出为整数向量。代码如下:
void bst::printlist(Node* node)
{
std::queue<Node*> travQueue;
std::vector<int> result;
travQueue.push(node);
while (!travQueue.empty())
{
result.push_back(node->val);
if (node->prev != NULL)
{
travQueue.push(node->prev);
}
if (node->next != NULL)
{
travQueue.push(node->next);
}
travQueue.pop();
node = travQueue.front();
}
}
但是,我完全不知道如何将结果向量转换为准确表示所有缺失节点的向量,这些节点在相当不平衡的树中作为间隙存在,
对于这个例子,当它需要包含每个缺失节点的信息一直到底层时,向量将只用从左到右的顺序填充整数。在编写实际代码以使用 ASCII 字符打印树时,如果我能够确定在何处绘制节点以及在何处不绘制节点,我将需要此信息——因此,我计划在这些间隙处包含虚拟值以区分。
有人对解决这个问题的方法有什么建议吗?
谢谢!
这是一个很好的答案,感谢@NicoSchertler:
“您可以将 prev 和 next 推送到 travQueue,即使它们是 nullptr。当您在迭代中到达 nullptr 时,将虚拟值添加到结果中,并将另外两个 nullptr 添加到 travQueue 以用于不存在的子项。”
这是我的代码:
std::queue<Node*> travQueue;
std::vector<int> result;
int h = treeheight(root) + 1;
travQueue.push(node);
for (int i = 0; i < pow(2, h) - 1; i++)
{
node = travQueue.front();
if (node != nullptr)
{
if (node->prev != nullptr)
{
travQueue.push(node->prev);
} else
{
travQueue.push(nullptr);
}
if (node->next != nullptr)
{
travQueue.push(node->next);
} else
{
travQueue.push(nullptr);
}
} else
{
travQueue.push(nullptr);
travQueue.push(nullptr);
}
if (node != nullptr)
{
result.push_back(node->val);
} else
{
result.push_back(-1);
}
travQueue.pop();
}
return result;