待完善,有漏洞
详细说起二叉树,坐下来用笔画一下就总结为3种情况,但是都知道懒为人之本性,我就以精神力(修仙者必备技能)带着读者画一遍。
咱们先说按照先左后右的规则,走一棵二叉树有什么选择:1、往左;2、往右, 不难哈。
那咱们就往左一直走呗,走一个就把小结点放经脉里(经脉是一个栈容器)就走着走着,走成了这种情况。
那意思说我们现在精神力在这个方向已经到极限了,换个方向修炼呗:IF左为空,咱们就else。 (这里第一次走到这个实心节点,留意一下就好了)
那就扭头往右修炼【机智BUFF加持(:】
–吭哧~ 吭哧~ 吭哧~
终于我们把头扭过来了,现在我们就往右修炼。(这里是第二次到这个节点,留意一下就好)。
在这里就要稍微费点功夫了(瓶颈到了)。现在这个节点是没有东西可走了,但这可是有隐藏技能需要学的,学成了就能越级pk了呀,这可是超级技能,而我们没到过这,假装闭着眼睛修炼不清楚这里的情况。所以我们给它加一个空节点
那这向右修炼是不是就3个情况:1)、这有路我们没来过,我们往右走,顺便把他学到经脉里面;2)这个地方是个null,无路可走,那我们只能回头了;3)这有路但我们来过(原来我们已经学过超级技能),那我们也只能回头了;。 也就是说右走之第一种我们往右走一步,后两种情况都回头往上走
----那我们讨论下,继续右走是什么情况,继续右走会到达一个新的节点(新的境界),新的境界就要按规则继续先左后右的修炼了。
----那回头往上走呢,那就说明当前这个实心节点以后都不会再来了。那我们是不是要标记一下呢。以后不用再来尝试修炼了,太old了,就old=this实心节点。
那我们的修炼过程就变成了这种,看来有时候回头是岸可能又是另一种新的风景【假装有道理(:】。
修炼到这里我们修炼思路就已经出来了,只要按照这个逻辑下去就可以成仙了。
道友们是不是注意到这里又有个3,这里我说一个规律,第一次访问这个节点时print就是先序,第二次访问这个节点print就是中序,第三次访问这个节点时print就是后序。道友们可以对每个二叉树画出来像下面这个走向的图,为每个节点标记上1、2、3,直接按照写出来1的顺序写出每个节点就是先序,中序和后序同理。
代码:
public TreeNode ConvertBST(TreeNode root)
{
TreeNode[] sta = new TreeNode[1000];
TreeNode the = root;
TreeNode old = null;
int top = 0;
sta[top++] = root;
if (top != 0)
{
if (the.left != null)
{
sta[top++] = the;
the = the.left; //第一次访问一个新的节点时(左子树)
}
else
{
if (the.right != null && the.right != old)
{
sta[top++] = the;
the = the.right; //第二次访问the节点
}
else if (the.right != null && the.right == old)
{
old = the;
the = sta[--top]; //第三次访问这个节点回头往上走
}
else if (the.right == null) //其实这里也可以判断等不等于old,等就是走过,不等为没走过
{
old = the;
the = sta[--top]; //回头走时做标记这个可以和上边扭头往上走合并。
}
}
}
}
祝各位道友早日成仙!