首页 > 其他 > 详细

二叉树的实现

时间:2020-04-16 14:05:04      阅读:67      评论:0      收藏:0      [点我收藏+]

递归的方式:
1.二叉树遍历实现
注意:
        1.数据构造是根据中间,左,右的方式实现的。
        2.树的建成都是由底部到顶部
        3.先序遍历【中左右】
          中序遍历【左中右】
          后序遍历【左右中】
class TreeNode(object):
    def __init__(self, data=0,left=0,right=0):
        self.data = data
        self.left = left
        self.right = right

class BTree(object):
    def __init__(self,root=0):
        self.root = root
    def is_empty(self):
        if self.root is 0:
            return True
        else:
            return False

    def preOrder(self,treenode):
        if treenode is 0:
            return
        print(treenode.data)
        self.preOrder(treenode.left)
        self.preOrder(treenode.right)

    def inOrder(self,treenode):
        if treenode is 0:
            return
        self.inOrder(treenode.left)
        print(treenode.data)
        self.inOrder(treenode.right)

    def postOrder(self,treenode):
        if treenode is 0:
            return
        self.postOrder(treenode.left)
        self.postOrder(treenode.right)
        print(treenode.data)

if __name__ == ‘__main__‘:
    n1 = TreeNode(data=1)
    n2 = TreeNode(2,n1,0)
    n3 = TreeNode(3)
    n4 = TreeNode(4)
    n5 = TreeNode(5,n3,n4)
    n6 = TreeNode(6,n2,n5)
    n7 = TreeNode(7,n6,0)
    n8 = TreeNode(8)
    root = TreeNode(‘root‘,n7,n8)
    bt =BTree(root)
    print(‘preOrder is ‘)
    print(bt.preOrder(bt.root))
    print(‘inOrder is ‘)
    print(bt.inOrder(bt.root))
    print(‘postOrder is ‘)
    print(bt.postOrder(bt.root))
运行的结果:

技术分享图片
preOrder is
root 7 6 2 1 5 3 4 8 None
inOrder is
1 2 6 3 5 4 7 root 8 None
postOrder is
1 2 3 4 5 6 7 8 root None
Process finished with exit code 0
View Code

 



优点:容易理解,使用0代替空的叶子。以null来表示结束。

缺点:对用的数据添加有要求。不利于使用。

改进:

class Node(object):
    """节点类"""
    def __init__(self, item, lchild=None, rchild=None):
        self.elem = item
        self.lchild = lchild
        self.rchild = rchild
class Tree(object):
    """树类"""
    def __init__(self):
        self.root = None
    def add(self, item):
        """为树添加节点"""
        node = Node(item)
        #如果树是空的,则对根节点赋值
        if self.root == None:#is None
            self.root = node
            return
        queue = [self.root]
        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):
      """广度遍历:利用队列实现树的层次遍历"""
      if self.root == None:
        return
      queue = []
      queue.append(self.root)
      while queue:
        node = queue.pop(0)
        print(node.elem,end=‘ ‘)
        if node.lchild != None:
          queue.append(node.lchild)
        if node.rchild != None:
          queue.append(node.rchild)

    def preorder(self, node):
      """递归实现先序遍历"""
      if node == None:
        return
      print(node.elem,end=‘ ‘)
      self.preorder(node.lchild)
      self.preorder(node.rchild)

    def inorder(self, node):
      """递归实现中序遍历"""
      if node == None:
        return
      self.inorder(node.lchild)
      print(node.elem,end=‘ ‘)
      self.inorder(node.rchild)

    def postorder(self, node):
      """递归实现后序遍历"""
      if node == None:
        return
      self.postorder(node.lchild)
      self.postorder(node.rchild)
      print(node.elem,end=‘ ‘)
if __name__ == ‘__main__‘:
  tree = Tree()
  #添加数
  tree.add(0)
  tree.add(1)
  tree.add(2)
  tree.add(3)
  tree.add(4)
  tree.add(5)
  tree.add(6)
  tree.add(7)
  tree.add(8)
  tree.add(9)
  print(‘\n广度遍历:‘)
  tree.breadth_travel()
  print(‘\n先序遍历:‘)
  tree.preorder(tree.root)
  print(‘\n中序遍历:‘)
  tree.inorder(tree.root)
  print(‘\n后序遍历:‘)
  tree.postorder(tree.root)

使用非递归的实现:

技术分享图片
import queue
def PreOrderWithoutRecursion(self,node):
    ‘‘‘
    非递归深度优先遍历——前序遍历
    使用栈数据结构保存结点信息
    ‘‘‘
    stacknode = queue.LifoQueue()
    while(node is not None or not stacknode.empty()):
        if(node is not None):
            print(node.elem, end= )
            stacknode.put(node.rchild)
            node = node.lchild
        else:
            node = stacknode.get()

import queue
def InOrderWithoutRecursion(self,node):
    ‘‘‘
    非递归深度优先遍历——中序遍历
    使用栈数据结构保存结点信息
    ‘‘‘
    stacknode = queue.LifoQueue()
    while(node is not None or not stacknode.empty()):
        if(node is not None):
            stacknode.put(node)
            node = node.lchild
        else:
            node = stacknode.get()
            print(node.elem, end= )
            node = node.rchild

import queue
def PostOrderWithoutRecursion(self,node):
    ‘‘‘
    非递归深度优先遍历——后序遍历
    使用栈数据结构保存结点信息
    保存前一个被访问过的结点
    ‘‘‘
    stacknode = queue.LifoQueue()
    pre = node
    while(node is not None):
        while (node.lchild is not None):
            stacknode.put(node)
            node = node.lchild
        while (node is not None and (node.rchild is None or node.rchild == pre)):  # 当前结点没有右孩子或者右孩子刚被访问过,则访问改结点
            print(node.elem, end= )
            pre = node
            if (stacknode.empty()):
                return
            node = stacknode.get()
        stacknode.put(node)
        node = node.rchild
View Code

 



















二叉树的实现

原文:https://www.cnblogs.com/topass123/p/12712274.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!