二叉树的遍历以及重建(Python实现)
2017-02-21 18:11
435 查看
二叉树的遍历以及重建(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
相关文章推荐
- python实现二叉树以及二叉树的遍历--1(面向对象的方法实现)
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)(二)
- python实现二叉树以及二叉树的遍历--1(函数实现)
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)
- 「数据结构」二叉树的遍历以及Python实现
- 《面试》---Python 实现二叉树结构以及相关遍历
- 二叉树的建立以及遍历的多种实现(python版)
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
- python实现二叉树,以及二叉树的遍历
- Python实现二叉树的前序遍历、中序遍历
- 二叉树的非递归前序、中序以及后序遍历C++模版类实现
- 二叉树三种遍历(递归以及非递归实现)
- C#实现二叉树数据结构以及先序、中序、后续遍历
- java实现二叉树的构建以及3种遍历方法
- C语言实现二叉树的建立、遍历以及表达式的计算
- java实现二叉树的构建以及3种遍历方法
- 二叉树的建立、遍历,以及给定二叉树前序遍历和中序遍历重建二叉树问题。
- 二叉树的非递归中序遍历以及层序遍历实现
- 二叉树的建立以及三种遍历方式的递归、非递归的实现
- java实现二叉树的构建以及3种遍历方法