浅说二叉树修炼之如何成仙

7 篇文章 1 订阅
3 篇文章 0 订阅

待完善,有漏洞

详细说起二叉树,坐下来用笔画一下就总结为3种情况,但是都知道懒为人之本性,我就以精神力(修仙者必备技能)带着读者画一遍。
咱们先说按照先左后右的规则,走一棵二叉树有什么选择:1、往左;2、往右, 不难哈。
那咱们就往左一直走呗,走一个就把小结点放经脉里(经脉是一个栈容器)就走着走着,走成了这种情况。
IF之一直左走
那意思说我们现在精神力在这个方向已经到极限了,换个方向修炼呗:IF左为空,咱们就else。 (这里第一次走到这个实心节点,留意一下就好了)
那就扭头往右修炼【机智BUFF加持(:】
ELSE扭头向右修炼

–吭哧~ 吭哧~ 吭哧~
终于我们把头扭过来了,现在我们就往右修炼。(这里是第二次到这个节点,留意一下就好)。
在这里就要稍微费点功夫了(瓶颈到了)。现在这个节点是没有东西可走了,但这可是有隐藏技能需要学的,学成了就能越级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]; //回头走时做标记这个可以和上边扭头往上走合并。
                        }
                        
                    }
                }


}

祝各位道友早日成仙!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值