前两天看了二叉树的相关知识,包括二叉树的广度优先遍历,深度优先遍历,二叉树的添加,前序遍历,中序遍历以及后序遍历,最后看了给定二叉树的前序和中序遍历结果(或者给定二叉树的后序和中序遍历结果)写出另一个遍历结果(中序遍历是一定要给的)
# -*- coding: utf-8 -*-
"""
Created on Thu May 31 19:57:32 2018
@author: xuanxuan
"""
#学习一下二叉树的相关知识
#(包括二叉树的广度优先遍历,按照广度优先遍历添加元素到现有的树,以及前序中序后序遍历)
class Node():
def __init__(self,item):
self.elem=item
self.lchild=None
self.rchild=None
class Tree():
def __init__(self):
self.root=None
def add(self,item):
node=Node(item)
queue=[self.root]
if self.root is None:
self.root=node
return
while queue:
cur_node=queue.pop(0)
if cur_node.lchild is None:
cur_node.lchild=node
return
else:
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild=node
return
else:
queue.append(cur_node.rchild)
def breadth_travel(self):
queue=[self.root]
while queue:
cur_node=queue.pop(0)
print(cur_node.elem,end=' ')
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
def preorder(self,root):
if root is None:
return
print(root.elem,end=' ')
self.preorder(root.lchild)
self.preorder(root.rchild)
def inorder(self,root):
if root is None:
return
self.inorder(root.lchild)
print(root.elem,end=' ')
self.inorder(root.rchild)
def postorder(self,root):
if root is None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.elem,end=' ')
if __name__=="__main__":
tree=Tree()
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
print("广度优先遍历结果为:")
tree.breadth_travel()
print("\n前序遍历结果为:")
tree.preorder(tree.root)
print("\n中序遍历结果为:")
tree.inorder(tree.root)
print("\n后序遍历结果为:")
tree.postorder(tree.root)
看了一遍老师的思路 自己写了一下,过几天再来复习 再过一遍!~
首先说一下:
前序遍历是 根,左,右
中序遍历是: 左,根,右
后序遍历是:左,右,根
你可以看作无论是哪种遍历都是按照根节点的顺序来说的,前序遍历就是根在最前面,而且左节点永远都是在右节点的左边!!!
然后接下来举一个例子:
假设前序遍历结果是: 1 2 4 5 3
中序遍历结果为:4 2 5 1 3
则后序遍历结果为:4 5 2 3 1
首先前序遍历是根节点先遍历 所以1 是根节点,然后根据中序遍历的结果 以1为中心分成左右两部分 也就是4 2 5 在左子树,3 位于右子树,然后 看前序遍历 2 4 5 (左子树)
可以知道1 是左子树的根节点 然后再看中序遍历结果,以2为中心分为4 (左子树)和5 右子树 然后3 就是右边子树的根节点
反正宗旨就是先看前序遍历结果,先找出根节点,再去中序遍历结果去根据根节点划分为左右两个子树,接下来就是不停的循环操作上述过程
数据结构就暂时先看到这里,接下来打算看操作系统和计算机网络的视频~~~然后下周一面试的宜信还要求数据库呢 还不会,,,,