每日算法题—二叉树寻路

题目描述

在一棵无限的二叉树上,每个节点都有两个子节点,节点按照下图顺序排列,给定一个节点,求该节点到根节点的路径。



如:输入节点14,返回[1,3,4,14]

思路

这道题我认为是到数学题,本质上是要找到知道子节点退出父节点的公式和该节点位于第几层,然后不断的往上求父节点的值就可以了。
试想如果节点排序是一个方向,而不是交错的排列,如下图:


那么4=22,5=22+1,6=32,7=32+1
即:节点x,其左孩子=2x,右孩子=2x+1
上面是节点的顺序是一个方向的情况,如果按照题目的顺序又是怎么样呢?
举个例子:1 2 3 4 5 6 7 8
现在变成了8 7 6 5 4 3 2 1 ,相当于位置发生了镜像交换,
1—>8 2—>7 3—>6 4—>5
他们加起来的总数是不变得,所以知道1 可以 通过(1+8)-1计算出8
假设这一排个数为T个,那么第x个数镜像交换后的值为
(第1个数+第T个数)-第x个数

回到题目中,5 的左孩子本来是10 ,但是现在被镜像交换了,所以可以求得5现在的左孩子是:(8+15)-10 = 13
同理:7现在的左孩子是:(8+15)-14 = 9
由于这棵树每个节点都有左右孩子,第L层的第一个值是:2^L, 最后一个值是:2^(L+1) - 1
假设节点N,位于第L层,那么其左节点=2^L + 2^(L+1)-1 - 2N
那么知道一个节点反推其父节点,比如知道左节点的值left,求父节点的值:
父节点=(2^L + 2^(L+1) -1-left)/2
比如:5 = (2^3 + 2^4 -1-13)/2 = (8+15-13)/2 = 5
刚才那是左节点的情况,其实右节点推父节点也是一样的:
比如:5 = (2^3 + 2^4-1-12)/2 = (8+15-12)/2 = 11/2 = 5
因为int 除以 int 最后小数被忽略了,所以结果还是5
所以我们得到了知道子节点求父节点的公式:(2^L + 2^L +1-1-left)/2
现在唯一不知道的就是怎么求出L,即子节点是在那一层,假设节点值为N,求L:
不慌,虽然数学老师教我们的知识都差不多忘了,但是我们是程序员,有本办法,从前面知道每一层的数都在 2^L 至 2^(L+1) -1 之间,所以大不了写个循环判断嘛,很简单,另一个办法就是想起被数学支配的恐惧:直接求对数,L=logN/log2+1 别问,问就是不知道

所以到此我们总结下,已知节点N,求其父节点步骤:

  1. 求出N所在层,即:L = logN/log2+1
  2. 再求父节点:(2^L + 2^(L+1) -1-N)/2

有了两个公式代码就好写了

实现

  fun pathInZigZagTree(label: Int): List<Int> {
        var level = (Math.log(label.toDouble()) / Math.log(2.0)).toInt() + 1//求出节点所在的层
        println(level)
        val list = arrayListOf<Int>()
        list.add(label)
        var result: Int = label
        while (level > 1) {//有多少层,就有多少个父节点
            result = p(result, level--)
            list.add(0, result)
        }
        return list
    }

    fun p(label: Int, level: Int): Int {
        println("" + label + " " + level)
        var l = level - 1//
        val total: Int = (Math.pow(2.0, l.toDouble()) + Math.pow(2.0, (l + 1).toDouble()) - 1).toInt() //求出这一层首个节点值+最后个节点值总和
        return (total - label) / 2//求出父节点值
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 二叉树 1 二叉树简介 二叉树是树的特殊一种,具有如下特点: 1、每个结点最多有两颗子树,结点的度最大为2。2、左...
    孔雨露阅读 931评论 0 2
  • 介绍 二叉树的结构 二叉树常考的原因有如下几点1、它可以结合链表、栈、队列和字符串等数据结构出题2、需要熟练掌握图...
    雨住多一横阅读 437评论 0 1
  • 树形结构 在前面章节中介绍到的数据结构,都为线性结构,比如链表,数组,队列等,都属于线性结构,类似于通过一根线串在...
    ducktobey阅读 1,176评论 0 0
  • 树的基本概念 节点,根节点,父节点,子节点,兄弟节点都是属于树的范涛; 一棵树可以没有任何节点,称为空树; 一棵树...
    coder_feng阅读 1,069评论 0 0
  • 生活中 谁都会被工作缠身 情感交织或友情或恋情 此情此景 有人处理的好 有人却乱糟糟 众所周知 杨雄是一个大忙人 ...
    旖旎i阅读 140评论 2 11