二叉树的遍历以及重建(Python实现)
来源:互联网 发布:血源诅咒妹子捏脸数据 编辑:程序博客网 时间:2024/05/16 18:00
二叉树的遍历以及重建(Python实现)
二叉树(Binary Tree):一种树形结构,它的特点是每个节点至多只有两颗子树,即不存在度大于2的结点,
并且,二叉树的子树有左右之分,其次序不能任意颠倒。
二叉树结点的表示
class TreeNode: def __init__(self,value=None,left=None,right=None): self.value=value self.left=left self.right=right
二叉树的遍历
# 前序遍历:以“根左右”顺序递归遍历def preorder_traverse(node): if node is None: return None print(node.value) preorder_traverse(node.left) preorder_traverse(node.right)# 中序遍历:以“左根右”顺序递归遍历def inorder_traverse(node): if node is None: return None inorder_traverse(node.left) print(node.value) inorder_traverse(node.right)# 后序遍历:以“左右根”顺序递归遍历def postorder_traverse(node): if node is None: return None postorder_traverse(node.left) postorder_traverse(node.right) print(node.value)
PS:递归还不算熟悉,先挖坑之后填。
下面创建一个二叉树并将其遍历:
if __name__=='__main__': a1 = TreeNode(1) a2 = TreeNode(2) a3 = TreeNode(3) a4 = TreeNode(4) a5 = TreeNode(5) a6 = TreeNode(6) a7 = TreeNode(7) a8 = TreeNode(8) a1.left = a2 a2.left = a4 a4.right = a7 a1.right = a3 a3.left = a5 a3.right = a6 a6.left = a8 preorder_traverse(a1) inorder_traverse(a1) postorder_traverse(a1)
经典问题:根据前序和中序遍历结果重建(还原)二叉树
剑指offer原题:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析:
- 根据前序遍历序列第一个元素1可知二叉树root结点值为1。
- 使用1把中序遍历序列分成两部分,左侧 [4,7,2]一定是root.left所有值,右侧 [5,3,8,6]一定是root.right所有值。
- [4,7,2]的前序遍历的顺序是前序序列第2-4个数值[2,4,7],所以在这棵子树2 是root结点数值。
- 将2分开[4,7,2]为 [4,7]和[],发现 4,7两个数值都位于左结点,依次确定下一子树。。
- 同理,root.right的[5,3,8,6]可以根据与[3,5,6,8]顺序关系依次确定整个二叉树。
总结:
- 先获得root结点的值,根据值的位置把中序遍历序列分为两部分
- 根据两部分序列长度将除root值外的前序序列同样分为两部分
- 数组两两组合通过递归找到子孙树左右节点以及值
- 注意将序列分割的起点以及终点
答案:
class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): if len(pre) == 0: return None # write code here root_val = pre[0] root_position = tin.index(root_val) root = TreeNode(root_val) root.left = self.reConstructBinaryTree(pre[1:root_position + 1], tin[:root_position]) root.right = self.reConstructBinaryTree(pre[root_position + 1:], tin[root_position + 1:]) return root
参考:http://blog.csdn.net/littlethunder/article/details/9707669
0 0
- 二叉树的遍历以及重建(Python实现)
- 重建二叉树以及树的遍历
- python实现二叉树,以及二叉树的遍历
- python实现二叉树以及二叉树的遍历--1(面向对象的方法实现)
- python实现二叉树以及二叉树的遍历--1(函数实现)
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)
- 「数据结构」二叉树的遍历以及Python实现
- 633(二叉树的遍历,二叉树重建)
- 二叉树的建立、遍历,以及给定二叉树前序遍历和中序遍历重建二叉树问题。
- 二叉树- 遍历& 重建
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)(二)
- 二叉树的重建(递归实现)
- Java 二叉树的实现以及遍历
- hihoCoder - 1049 - 后序遍历 (二叉树的重建!!)
- 二叉树的遍历及重建
- 二叉树的遍历和重建
- 二叉树的遍历;前序 中序 后序遍历二叉树;递归 非递归实现; 重建二叉树;编程之美重建二叉树
- 根据前序遍历和中序遍历重建二叉树的Java实现
- Android ListView(一)
- HDU 1176 免费馅饼(dp)
- java中加载properties文件
- Java中的equals和hashCode方法详解
- 清闲、安静
- 二叉树的遍历以及重建(Python实现)
- checkbox中,根据获取的文字,如果有互斥选项,提示并取消最后选择的一个选项的实现
- Mac 防还原系统(设置固件密码)
- 求0的个数
- 算法入门-程序设计入门
- 第一次面试
- 如何重置 RHEL7/CentOS7 系统的密码
- linux常用软件和便捷设置
- 深度神经网络(DNN)、卷积神经网络(CNN)、循环神经网络(RNN)(神经网络的基础知识)