• [百度面试题] S型层次遍历树


    设计S型层次遍历树的算法,比如根节点是第一层,第二层从左至右遍历,第三层从右至左遍历,第四层再从左至右遍历,以此类推。

    利用队列和每层的节点数,思路是记录每层的节点数并把当前层节点放入队列,奇数层从左到右放,偶数层从右到左放。当前层的队列为空表示输出完一层,层数加一。由于要记录的中间变量比较多,我的第一个实现比较复杂。

    实现一:

    import Queue
    
    class Node(object):
        """docstring for node"""
        def __init__(self, value, left=None, right=None):
            self.value = value
            self.left = left
            self.right = right
    
        def s_print_tree(self, root):
            if root==None:
                return
            node_Queue = Queue.Queue()
            tmp_Queue = []
            node_Queue.put(root)
            deepth = 1
            length = 1
            nextlen = 0
            flag = 0
            while not node_Queue.empty():
                if deepth%2==0:
                    if flag==0:
                        while not node_Queue.empty():
                            tmp_Queue.append(node_Queue.get())
                        while tmp_Queue:
                            node_Queue.put(tmp_Queue.pop())
                        flag = 1
                    node = node_Queue.get()
                    print node.value
                    length -= 1
                    if node.left!=None:
                        node_Queue.put(node.left)
                        nextlen += 1
                    if node.right!=None:
                        node_Queue.put(node.right)
                        nextlen += 1
                else:
                    if flag==0:
                        while not node_Queue.empty():
                            tmp_Queue.append(node_Queue.get())
                        while tmp_Queue:
                            node_Queue.put(tmp_Queue.pop())
                        flag = 1
                    node = node_Queue.get()
                    print node.value
                    length -= 1
                    if node.right!=None:
                        node_Queue.put(node.right)
                        nextlen += 1
                    if node.left!=None:
                        node_Queue.put(node.left)
                        nextlen += 1
    
                if length==0:
                    deepth += 1
                    length = nextlen
                    nextlen = 0
                    flag = 0
    
    
    if __name__ == '__main__':
        tree = Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'), Node('H'))))
        tree.s_print_tree(tree)
    

      实现二,利用栈来实现,但发现python基本数据结构中竟然没有栈,只有队列。然而python的队列不仅仅是一个先进先出的数据结构,python的队列是线程安全的,可以应用于多线程程序。如果仅仅为了用队列先进先出的和栈的先进后出性质,用队列就可以了,不必再导入Queue模块。

    实现二:

    import Queue
    
    class Node(object):
        """docstring for node"""
        def __init__(self, value, left=None, right=None):
            self.value = value
            self.left = left
            self.right = right
    
        def s_print_tree(self, root):
            if root==None:
                return
            node_Queue = []
            next_Queue = []
            node_Queue.append(root)
            deepth = 1
            while len(node_Queue)!=0 or len(next_Queue)!=0:
                if len(node_Queue)!=0:
                    if deepth%2==0:
                        node = node_Queue[-1]
                        if node.left!=None:
                            next_Queue.append(node.left)
                        if node.right!=None:
                            next_Queue.append(node.right)
                        print node_Queue[-1].value
                        del node_Queue[-1]
    
                    else:
                        node = node_Queue[-1]
                        if node.right!=None:
                            next_Queue.append(node.right)
                        if node.left!=None:
                            next_Queue.append(node.left)
                        print node_Queue[-1].value
                        del node_Queue[-1]
    
    
                else:
                    node_Queue = next_Queue
                    next_Queue = []
                    deepth += 1
    
    
    
    if __name__ == '__main__':
        tree = Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'), Node('H'))))
        tree.s_print_tree(tree)
    

      

  • 相关阅读:
    关于二进制补码表示法的一些备忘
    没有''结尾的字符串输出(0)
    关于malloc与字符指针的一些易错点
    centos安装tmux过程
    mac包管理器Homebrew安装命令
    windows下ThinkPHP3.2.3使用memcache缓存
    AJAX请求 $.ajaxSetup方法的使用:设置AJAX请求的默认参数选项,当程序中需要发起多个AJAX请求时,则不用再为每一个请求配置请求的参数
    Name for argument type [java.lang.String] not available
    ag grid
    Javascript 严格模式use strict详解
  • 原文地址:https://www.cnblogs.com/lkprof/p/4918562.html
Copyright © 2020-2023  润新知