Examples of statistics and transformations for binary trees of python data structures

  • 2020-04-02 13:39:19
  • OfStack

Get the depth of the binary tree

Is the final level of binary tree, as shown in the following figure:

< img SRC = "border = 0 / / files.jb51.net/file_images/article/201404/201442991724640.jpg? 201432991752 ">

Implementation code:


def getheight(self):
        '''  Get binary tree depth  '''
        return self.__get_tree_height(self.root)

    def __get_tree_height(self, root):
        if root is 0:
            return 0
        if root.left is 0 and root.right is 0:
            return 1
        else:
            left = self.__get_tree_height(root.left)
            right = self.__get_tree_height(root.right)
            if left < right:
                return right + 1
            else:
                return left + 1

Two, leaf statistics

The leaf is the left pointer and the right pointer to the node of the binary tree pointing to the empty node


def getleafcount(self):
        '''  Gets the number of binary tree leaves  '''
        return self.__count_leaf_node(self.root)

    def __count_leaf_node(self, root):
        res = 0
        if root is 0:
            return res
        if root.left is 0 and root.right is 0:
            res += 1
            return res
        if root.left is not 0:
            res += self.__count_leaf_node(root.left)
        if root.right is not 0:
            res += self.__count_leaf_node(root.right)
        return res

Third, the statistics leaf branch node

The left and right Pointers of other nodes opposite the leaf nodes point to other nodes


def getbranchcount(self):
        '''  Gets the number of binary tree branch nodes  '''
        return self.__get_branch_node(self.root)

    def __get_branch_node(self, root):
        if root is 0:
            return 0
        if root.left is 0 and root.right is 0:
            return 0
        else:
            return 1 + self.__get_branch_node(root.left) + self.__get_branch_node(root.right)

Four, binomial trees around the tree interchange


def replacelem(self):
        '''  The left and right subtrees of all nodes of the binary tree are exchanged  '''
        self.__replace_element(self.root)

    def __replace_element(self, root):
        if root is 0:
            return
        root.left, root.right = root.right, root.left
        self.__replace_element(root.left)
        self.__replace_element(root.right)

All of these methods, all of these operations, are recursive. The definition of a binary tree is also a recurrence. Attached is the complete code at the end:


# -*- coding: utf - 8 - *-

    
class TreeNode(object):

    def __init__(self, left=0, right=0, data=0):
        self.left = left
        self.right = right
        self.data = data

    
class BinaryTree(object):

    def __init__(self, root=0):
        self.root = root

    def is_empty(self):
        if self.root is 0:
            return True
        else:
            return False

    def create(self):
        temp = input('enter a value:')
        if temp is '#':
            return 0
        treenode = TreeNode(data=temp)
        if self.root is 0:
            self.root = treenode

        treenode.left = self.create()
        treenode.right = self.create()

    def preorder(self, treenode):
        ' Before the order, pre-order . NLR ) traversal '
        if treenode is 0:
            return
        print treenode.data
        self.preorder(treenode.left)
        self.preorder(treenode.right)

    def inorder(self, treenode):
        ' In order ( in-order . LNR'
        if treenode is 0:
            return
        self.inorder(treenode.left)
        print treenode.data
        self.inorder(treenode.right)

    def postorder(self, treenode):
        ' After order, post-order . LRN ) traversal '
        if treenode is 0:
            return
        self.postorder(treenode.left)
        self.postorder(treenode.right)
        print treenode.data

    def preorders(self, treenode):
        ' Before the order, pre-order . NLR ) non-recursive traversal '
        stack = []
        while treenode or stack:
            if treenode is not 0:
                print treenode.data
                stack.append(treenode)
                treenode = treenode.left
            else:
                treenode = stack.pop()
                treenode = treenode.right

    def inorders(self, treenode):
        ' In order ( in-order . LNR)  Non-recursive traversal '
        stack = []
        while treenode or stack:
            if treenode:
                stack.append(treenode)
                treenode = treenode.left
            else:
                treenode = stack.pop()
                print treenode.data
                treenode = treenode.right

    def postorders(self, treenode):
        ' After order, post-order . LRN ) non-recursive traversal '
        stack = []
        pre = 0
        while treenode or stack:
            if treenode:
                stack.append(treenode)
                treenode = treenode.left
            elif stack[-1].right != pre:
                treenode = stack[-1].right
                pre = 0
            else:
                pre = stack.pop()
                print pre.data

    # def postorders(self, treenode):
    #     ' After order, post-order . LRN ) non-recursive traversal '
    #     stack = []
    #     queue = []
    #     queue.append(treenode)
    #     while queue:
    #         treenode = queue.pop()
    #         if treenode.left:
    #             queue.append(treenode.left)
    #         if treenode.right:
    #             queue.append(treenode.right)
    #         stack.append(treenode)
    #     while stack:
    #         print stack.pop().data

    def levelorders(self, treenode):
        ' Sequence ( post-order . LRN ) non-recursive traversal '
        from collections import deque
        if not treenode:
            return
        q = deque([treenode])
        while q:
            treenode = q.popleft()
            print treenode.data
            if treenode.left:
                q.append(treenode.left)
            if treenode.right:
                q.append(treenode.right)

    def getheight(self):
        '''  Get binary tree depth  '''
        return self.__get_tree_height(self.root)

    def __get_tree_height(self, root):
        if root is 0:
            return 0
        if root.left is 0 and root.right is 0:
            return 1
        else:
            left = self.__get_tree_height(root.left)
            right = self.__get_tree_height(root.right)
            if left < right:
                return right + 1
            else:
                return left + 1

    def getleafcount(self):
        '''  Gets the number of binary tree leaves  '''
        return self.__count_leaf_node(self.root)

    def __count_leaf_node(self, root):
        res = 0
        if root is 0:
            return res
        if root.left is 0 and root.right is 0:
            res += 1
            return res
        if root.left is not 0:
            res += self.__count_leaf_node(root.left)
        if root.right is not 0:
            res += self.__count_leaf_node(root.right)
        return res

    def getbranchcount(self):
        '''  Gets the number of binary tree branch nodes  '''
        return self.__get_branch_node(self.root)

    def __get_branch_node(self, root):
        if root is 0:
            return 0
        if root.left is 0 and root.right is 0:
            return 0
        else:
            return 1 + self.__get_branch_node(root.left) + self.__get_branch_node(root.right)

    def replacelem(self):
        '''  The left and right subtrees of all nodes of the binary tree are exchanged  '''
        self.__replace_element(self.root)

    def __replace_element(self, root):
        if root is 0:
            return
        root.left, root.right = root.right, root.left
        self.__replace_element(root.left)
        self.__replace_element(root.right)

node1 = TreeNode(data=1)
node2 = TreeNode(node1, 0, 2)
node3 = TreeNode(data=3)
node4 = TreeNode(data=4)
node5 = TreeNode(node3, node4, 5)
node6 = TreeNode(node2, node5, 6)
node7 = TreeNode(node6, 0, 7)
node8 = TreeNode(data=8)
root = TreeNode(node7, node8, 'root')

    
bt = BinaryTree(root)

print u'''

 Generated binary tree 

------------------------
         root
      7        8
    6
  2   5
1    3 4

-------------------------

'''


Related articles: