剑指offer 07. 重建二叉树
程序员文章站
2022-03-14 20:49:27
...
题目链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
目录
题目:
方法1:左右递归法
方法的思想是,前序遍历中的第一个元素必定是根节点,于是首先把该节点作为根节点,进而寻找其左右子树。
相对于该根节点的左右子树,又是相对于其他节点的根节点。
根据二叉树的性质,找到前序遍历每个元素在中序遍历中的位置,这时候中序遍历这个位置左边的一定是全部的左子树,中序遍历这个位置右边的一定是全部右子树。
※另有一条二叉树之前似乎没注意到的性质,通过如下举例说明
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if not len(preorder):
return None
root = TreeNode(preorder[0])
index = inorder.index(preorder[0]) # 注意使用index方法
root.left = self.buildTree(preorder[1:index+1],inorder[:index])
root.right = self.buildTree(preorder[index+1:], inorder[index+1:])
return root # 一棵树的最上边的根
拓展:如果给了中序序列和后序序列
根据二叉树的前序+中序,或者后序+中序都可以还原一棵二叉树,中序序列在其中是必须的。
仍使用上例,这里对应的二叉树后序序列是:8,77,17,9,15,7,20,3
把后序序列reverse倒过来,变成3,20,7,15,9,17,77,8
可以发现如果把这个序列当做前序序列,按照重建二叉树的方法将会建出一棵完全镜像的二叉树,但是如果改变递归中的顺序,即先重建右子树,再重建左子树,就可以解决这个问题了~
另外是否二叉树翻转也有这里的思路,等到遇到对应题目时再进一步学习。
上一篇: PHP计划任务、定时执行任务的实现代码_PHP教程
下一篇: php抓取百度页面及对应字符串的方法
推荐阅读
-
《剑指offer》面试题6 重建二叉树
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
剑指offer31:整数中1出现的次数(从1到n整数中1出现的次数)
-
剑指offer28:找出数组中超过一半的数字。
-
剑指offer27:按字典序打印出该字符串中字符的所有排列
-
C#版剑指Offer-001二维数组中的查找
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
剑指offer13:数组[奇数,偶数],奇数偶数相对位置不变。
-
剑指offer第二天
-
剑指offer JZ31 整数中1出现的次数 Python 解