- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
就在我坐下来为 morris 中序遍历编写代码之前,我尝试了这个例子,但对于它在这种特殊情况下的工作方式有点困惑:
80
/ \
60 100
\ /
70 90
/
65
/
63
\
64
第一步:
60
\
70
/ \
65 80
/ \
63 100
\ /
64 90
据我了解下一步的算法70会成为65的右 child ,那么60会怎样呢?我很确定我遗漏了一些微不足道的东西,但不幸的是我无法确定它。
public void MorrisInorder() {
BSTNode<T> p = root, tmp;
while (p != null)
if (p.left == null) {
visit(p);
p = p.right;
}
else {
tmp = p.left;
while (tmp.right != null && // go to the rightmost node of
tmp.right != p) // the left subtree or
tmp = tmp.right; // to the temporary parent of p;
if (tmp.right == null) {// if 'true' rightmost node was
tmp.right = p; // reached, make it a temporary
p = p.left; // parent of the current root,
}
else { // else a temporary parent has been
visit(p); // found; visit node p and then cut
tmp.right = null; // the right pointer of the current
p = p.right; // parent, whereby it ceases to be
} // a parent;
}
}
我正在遵循的代码用于 morris 中序遍历。
最佳答案
直接回答你的问题,我认为你案例的第1步中的数字不准确,因为不应删除节点“80”到节点“60”的边。第1步中唯一的变化只是将节点“70”的右点重定向到节点“80”(见第1步),这表示算法经过节点“80”的左子树后的返回路径。
第一步:
80
/ ^ \
60 | 100
\ | /
70 90
/
65
/
63
\
64
添加节点“70”到节点“80”的返回路径后,由于当前节点“60”的左点为NULL,则当前节点将设置为节点“70”。同时,节点“65”的右点将被重定向到节点“70”
第 2 步:
80
/ ^ \
60 | 100
\ | /
70 90
/^
/ |
65
/
63
\
64
更详细的morris中序遍历代码如下。
假设我们有一个像这样的节点结构:
/* A binary tree tNode has data, pointer to left child
and a pointer to right child */
struct tNode
{
int data;
struct tNode* left;
struct tNode* right;
};
遍历是:
/* Function to traverse binary tree without recursion and
without stack */
void MorrisTraversal(struct tNode *root)
{
struct tNode *current,*pre;
if(root == NULL)
return;
current = root;
while(current != NULL)
{
/* This means there is no left sub-tree for current node,
then just print current node, and go to the right "child" node.
The right "child" node may be either its true child node,
or the returning path for "60" sub-tree (like "70" to "80") */
if(current->left == NULL)
{
printf(" %d ", current->data);
current = current->right;
}
else
{
/* before going to the left sub-tree, we need to find a returning path
to current node (such as when current node is "80", and we want to
go to "60", so we need to save the returning path from left sub-tree
to "80"). It is easy to imagine that we need to return to the current
node when we arriving the right-most node of current left sub-tree.
Therefore, we just go to the right-most node (the first condition in
while) and set the returning path at "pre->right == NULL" block, as
well as updating the current node. Another situation is that when we
arrive at the left-most leaf node (if not exist, it means current->left
is NULL, and we won't go into this block), we have already set the right
point of left-most leaf node as the returning node (it un-satisfies the
second condition of while loop), and then we will recover the right
point of this leaf node in the next "else" block.
*/
pre = current->left;
while(pre->right != NULL && pre->right != current)
pre = pre->right;
/* Make current as right child of its inorder predecessor */
if(pre->right == NULL)
{
pre->right = current;
current = current->left;
}
/* Revert the changes made in if part to restore the original
tree i.e., fix the right child of predecssor */
else `enter code here`
{
pre->right = NULL;
printf(" %d ",current->data);
current = current->right;
} /* End of if condition pre->right == NULL */
} /* End of if condition current->left == NULL*/
} /* End of while */
}
关于algorithm - 根据 morris inorder,这棵树的下一步是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19658570/
是否可以动态更新莫里斯图?我知道setData()将更新数据,但我想更新设置。即,用户能够选择是否堆叠条形图。 我已经尝试过: bChart.stacked = true; bChart.setDat
这个 morrisjs javascript 有什么问题? http://jsbin.com/dituriheje/edit?html,js,output ) Morris.js L
我正在尝试创建类似Google Analytics(分析)“受众群体概览”图的图形。我正在尝试将X轴上从凌晨12:00 am到11:00 pm的小时数设置为 这是我目前正在使用的: Morris.Li
我已经阅读了文档及其要求,但我不想要它 :D 尝试将其设置为未定义并删除它,但随后 javascript 提示它丢失了。 有没有办法隐藏它? 最佳答案 您可以通过下一个选项禁用它: Morris.Li
我想知道是否可以在条形图上设置最大轴值(例如,我希望数据的最高点是 y 轴的顶端)?我看到折线图上有 ymin 和 ymax 选项,但我似乎找不到有关条形图的任何信息。 此外,如果有人知道如何将轴车道
我正在使用 Morris.js 条形图。出于某种原因,应该在 HOVER OVER 上出现的数字列在左下角。有没有人为什么? 最佳答案 没有任何代码很难给出好的答案。但是,它可能与您的 CSS 文件有
是否可以以相反的顺序(0-100)设置 y 轴值? 顶部的最大值必须从 0 到底部的 100。 Morris.Line({ element: 'line-example', dat
我正在尝试根据本地数据文件 - sales.php(json 格式)动态绘制莫里斯线: [ { year: '2008', value: 20 }, { year: '2009', value
我使用 morris.js绘制折线图图形,但我无法弄清楚如何仅更改折线图中的点颜色和样式。有谁知道如何只更改点样式? 谢谢。 最佳答案 使用 pointFillColors 属性。来自文档: poin
这是当我们使用Knuth-Morris-Pratt算法时,在Scheme中计算失效函数(我们要返回多少步)的代码: (define (compute-failure-function p) (
我有一个问题,因为我做了后端的动态响应。我生成的代码是: new Morris.Line({ // ID of the element in which to draw
我在使用 Morris.js 库创建图表时遇到一些麻烦。我创建了运动应用程序,每次训练都有一些值(value)。其中之一是“锻炼”,它表示锻炼类型(“运行”、“游泳”、“骑自行车”)。我想显示带有日期
为什么我会遇到异常 Uncaught Error: Graph container element not found 当使用morris.js时? 最佳答案 解决方案:将 javascript 放在
我在 yii2 中使用了 morris js 图表,当数据范围太高时出现问题,较低的数据范围会崩溃,有什么办法可以清楚地看到它?另外,要显示整周的数据,需要在 x 轴上向上滚动。 function c
我试图暗示 morris.js 但我收到以下错误: 我试着实现了一些教程,这真的很容易,但到目前为止我得到了以下内容 new Morris.Line({ element: 'myfirstchar
我正在使用 morris.js 和 javascript 创建折线图。这是我的代码: Morris.Area({ element: 'hero-area', data: [
我希望自定义堆叠条形图上的悬停图例,这样它就不会显示在特定条形图中没有值但会显示在其他条形图中的标签。希望下面链接中的图片有助于解决问题。图片中的行军标签只有几个标签的值,但显示了所有标签。我知道我必
我有以下 .js.coffee 文件 jQuery -> Morris.Line element: 'averages_chart' data: [{month: '2014 01 01',
是否可以使用 morris.js 添加水平条形图? http://jsbin.com/uzosiq/2/embed?javascript,live 非常感谢! 最佳答案 如果你使用来自 https:/
我很好奇 morris.js 是否支持在单个标签上放置多个堆叠条以及是否有人知道解决方法。 我想要将 2 个图表堆叠在同一行上。蓝色和红色应该相互重叠,绿色和黄色应该相互重叠。 Morris.Bar(
我是一名优秀的程序员,十分优秀!