python实现二叉树的俯视图

概要:
给一个二叉树,代码实现输出俯视图,如:
这里写图片描述
代码实现:

#coding=utf8
#构造树节点
'''
基本思想:
对于每个节点输出关于根节点的层级和左右距离
树从0层开始计数
左距离:左子树上节点对于跟节点为1
右距离:右字数上节点对于跟节点为-1

相当于以树的根节点为坐标原点,每个树中的节点对应一个坐标轴
横轴表示距离,纵轴表示树的深度

树的俯视图即输出:这些点映射到横轴上,如有重叠取第一个,组成的序列。

待优化的地方:
1)在得到坐标后可以在O(n)的时间取得结果,我这里稍微复杂了点。
'''

class node(object):
    def __init__(self, data=None, left=None, right=None,x=0,y=0):
        self.data = data
        self.left = left
        self.right = right
        self.x=x
        self.y=y
def pre_order(tree):
    if tree==None:
        return
    print (tree.data)
    pre_order(tree.left)
    pre_order(tree.right)

#计算每个点的坐标,横坐标表示距离,纵坐标表示层级
def points(tree):
    if tree == None:
        return
    q = []
    q.append(tree)
    rs=[]  #格式如["D",0,0]
    level=0;#表示层级
    current_level_num=1;#表示当前层的节点个数
    next_level_num=0;#表示下一层节点个数
    d=[]#用于存储当前层级的节点
    while q:
        current = q.pop(0)
        d.append(current)
        current_level_num=current_level_num-1
        if current.left != None:
            q.append(current.left)
            next_level_num = next_level_num + 1
            current.left.x=current.x+1 #如果是往左,则在父亲节点基础上加1

        if current.right !=None:
            q.append(current.right)
            next_level_num = next_level_num + 1
            current.right.x=current.x-1#如果是往右,则在父亲节点上减 1

        if current_level_num==0:#当前层没有节点的时候层级加1
            current_level_num=next_level_num
            next_level_num=0
            for tmp in d:  #同一层级节点赋值
                tmp.y=level
                rs.append([tmp.data,tmp.x,tmp.y])
            d=[]
            level = level + 1
    return rs;
def get_tree_border(node_points):
    rs=[]
    lenth=len(node_points)
    x_set=set()
    for item in node_points:
        x_set.add(item[1])
    x_set=list(x_set)
    x_set.sort(reverse=True)
    for item_set in x_set:
        tmp_rs=[]
        for item_node in node_points:
            if(item_set==item_node[1]):
                tmp_rs.append(item_node)
        tmp_rs.sort(key=lambda obj:obj[2])
        rs.append(tmp_rs[0][0])
    return rs
if __name__ == '__main__':
    tree = node('a',node('b',
                         node("d"),
                         node("e",
                              node("h",
                                   node("l",
                                        node("p"))
                                   ,node("m")),
                              node("z")))
                   ,node('c',
                         node("f",
                              node("j"),
                              node("k",
                                   right=node("n",
                                              right=node("o"))))
                         ,node("g")
                         )
                )
    print("前序遍历一把")
    pre_order(tree)

    print("树的俯视结果如下:")
    node_points=points(tree)
    rs=get_tree_border(node_points)
    print(rs)
最后得到结果:
['p', 'd', 'b', 'a', 'c', 'g', 'o']



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Python实现二叉树的示例代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class BinaryTree: def __init__(self): self.root = None def insert(self, val): if not self.root: self.root = TreeNode(val) else: self._insert(val, self.root) def _insert(self, val, node): if val < node.val: if node.left: self._insert(val, node.left) else: node.left = TreeNode(val) else: if node.right: self._insert(val, node.right) else: node.right = TreeNode(val) def inorder_traversal(self): res = [] self._inorder_traversal(self.root, res) return res def _inorder_traversal(self, node, res): if not node: return self._inorder_traversal(node.left, res) res.append(node.val) self._inorder_traversal(node.right, res) def preorder_traversal(self): res = [] self._preorder_traversal(self.root, res) return res def _preorder_traversal(self, node, res): if not node: return res.append(node.val) self._preorder_traversal(node.left, res) self._preorder_traversal(node.right, res) def postorder_traversal(self): res = [] self._postorder_traversal(self.root, res) return res def _postorder_traversal(self, node, res): if not node: return self._postorder_traversal(node.left, res) self._postorder_traversal(node.right, res) res.append(node.val) ``` 这个二叉树类包含了插入节点、中序遍历、前序遍历和后序遍历等方法。其中,插入节点方法使用递归实现,遍历方法使用了递归和栈两种方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值