zoukankan      html  css  js  c++  java
  • (树)-线索二叉树

    class Node:
        def __init__(self):
            self.data = 0
            self.right = None
            self.left = None
            self.left_thread = 0  # 0没有子节点,1有子节点
            self.right_thread = 0
    
    
    def add(root, val):
        newnode = Node()
        newnode.data = val
        pre = newnode
        if root == None:
            root = newnode
            root.left = root
            root.right = None
            root.left_thread = 0
            root.right_thread = 1
            return root
        current = root.right
        if current == None:
            root.right = newnode
            newnode.left = root
            newnode.right = root
            return root
        parent = root
        pos = 0
        while current != None:
            if current.data > val:
                if pos != -1:
                    pos = -1
                    pre = parent
                parent = current
                if current.left_thread == 1:
                    current = current.left
                else:
                    current = None
            else:
                if pos != 1:
                    pos = 1
                    pre = parent
                parent = current
                if current.right_thread == 1:
                    current = current.right
                else:
                    current = None
        if parent.data > val:
            parent.left = newnode
            parent.left_thread = 1
            newnode.left = pre
            newnode.right = parent
        else:
            parent.right = newnode
            parent.right_thread = 1
            newnode.left = parent
            newnode.right = pre
        return root
    
    
    def trace(root):
        '''
        遍历线索二叉树
        :param root:
        :return:
        '''
        t = root
        while True:
            if t.right_thread == 0:
                # 右线索访问中节点
                t = t.right
            else:
                t = t.right
                while t.left_thread != 0:
                    t = t.left
            if t != root:
                print('[%d]' % t.data, end=' ')
            if t == root:
                break
    
    
    data = [1, 7, 3, 4, 5, 2, 9, 11, 13, 15, 12]
    
    root = None
    for i in range(len(data)):
        root = add(root, data[i])
    trace(root)

    output:

    [2] [3] [4] [5] [7] [9] [11] [12] [13] [15] 

  • 相关阅读:
    【Java】快速排序、归并排序、堆排序、基数排序实现总结
    【Java】二分查找、插值查找、斐波那契查找的实现,及分析
    【Java】Java实现常见的七种排序
    【C】常见的排序
    栈,迷宫问题
    海量数据处理问题
    【C】 布隆过滤器BloomFilter
    哈希变形---位图
    C实现Hash表,链式结构
    C实现Hash表,开放定址法
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441730.html
Copyright © 2011-2022 走看看