重建二叉树

news/2024/7/5 5:17:33

重建二叉树

【题目】:

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树,并返回重建后二叉树的根节点。

假设两个遍历的结果中没有重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

【解题思路】:

  • 从前序遍历中找到第一个结果作为根节点;
  • 在中序遍历中找到这个值,则这个值左边的值是左子节点;右边则是右子节点;
  • 利用递归,采用同样的方法重构二叉树。
# Define functions for binary tree
class TreeNode(object):def __init__(self, val):self.val = valself.left = Noneself.right = None# preOrder function
def pro_order(root):if not root:returnprint(root.val, end="->")pro_order(root.left)pro_order(root.right)#  inOrder function
def in_order(root):if not root:returnin_order(root.left)print(root.val, end='->')in_order(root.right)# Construct the binary tree
def construct_binary_tree(pro_order, in_order):if not pro_order or not in_order or len(pro_order) != len(in_order):returndef construct(pro_order, in_order):if not pro_order:return None#  build root noderoot = TreeNode(pro_order[0])#  find root node in inorderfor i in range(len(in_order)):if in_order[i] == root.val:break#  build left treeroot.left = construct(pro_order[1: len(in_order[:i]) + 1], in_order[:i])#  build right treeroot.right = construct(pro_order[i + 1:], in_order[i + 1:])return rootreturn construct(pro_order, in_order)#  test
pre = [1, 2, 4, 7, 3, 5, 6, 8]
ino = [4, 7, 2, 1, 5, 3, 8, 6]
root = construct_binary_tree(pre, ino)
print("PreOrder:")
pro_order(root)
print("None\nInOrder:")
in_order(root)
print("None")

运行结果:

示例代码2:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution(object):def buildTree(self, preorder, inorder):""":type preorder: List[int]:type inorder: List[int]:rtype: TreeNode"""if (not preorder) and (not inorder) and (len(preorder) == len(inorder)):return Nonenode = TreeNode(preorder[0])index = inorder.index(preorder[0])left_pre = preorder[1:index+1]left_in = inorder[:index]right_pre = preorder[index+1:]right_in = inorder[index+1:]node.left = self.buildTree(left_pre, left_in)node.right = self.buildTree(right_pre, right_in)return node

 


http://lihuaxi.xjx100.cn/news/266759.html

相关文章

听说你有10年的工作经验?还是你把1个经验反复用了10年?

点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!前几天,有位小伙伴提出离职,我找他聊了聊。我问他,离职的原因是什么?他说,现在的工作太枯燥乏味,缺少成…

超强汇总:学习Python列表,只需这篇文章就够了

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达ID:豌豆下的猫 公众号:Python猫千里之行,始于足下。要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好。今天&…

关于ProGuard的学习了解(从别处转来)

from:http://www.cnitblog.com/zouzheng/archive/2011/01/12/72639.html在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了。所以,在JNI应用中该慎用progurad啊。解决办…

百度盯上媒体生意?百度CTO王海峰详解智能媒体中台

9月27日,由中央网信办、上海市委网信委、新华通讯社联合主办,新华网、上海市委网信办、上海广播电视台、百度承办的“2020中国网络媒体论坛”在上海隆重举行。在百年未有之大变局的新形势下,作为中国网络媒体界层次最高、最具权威性和影响力的…

虚拟机CENTOS7下 安装8.0版本MySQL MySQL主从配置详细~

全部代码,写在后面吧! 全部的代码在后面。1、安装mysql 先rz命令上传一下!出现未响应是很正常的情况!等会就好啦。 ls查看一下,已经出现啦~ xz -d mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz这个解压不显示过程…

[Educational Codeforces Round 16]A. King Moves

[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board. You are given his position in format "cd", where c is the column from a to h and dis the row from 1 to 8. Find the number of moves permitted…

苏炳添博士论文研究自己,奥运学术两兼顾,还是暨大副教授,网友:真正的Run数据...

点击上方“视学算法”,选择加"星标"或“置顶”重磅干货,第一时间送达萧箫 发自 凹非寺量子位 报道 | 公众号 QbitAI“我为什么能跑这么快?”这可不是调侃,而是“亚洲飞人”苏炳添的正经博士论文!在题为《新时…

JVM 常用参数

常见参数配置 -XX:PrintGC 每次触发GC的时候打印相关日志-XX:UseSerialGC 串行回收-XX:PrintGCDetails 更详细的GC日志-Xms 堆初始值-Xmx 堆最大可用值-Xmn 新生代堆最大可用值-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.-XX:NewRatio 配置新生代与老年代…