1. 程式人生 > >python實現二叉樹的俯檢視

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']

相關推薦

python實現俯檢視

概要: 給一個二叉樹,程式碼實現輸出俯檢視,如: 程式碼實現: #coding=utf8 #構造樹節點 ''' 基本思想: 對於每個節點輸出關於根節點的層級和左右距離 樹從0層開始計數 左距離:左子樹上節點對於跟節點為1 右距離:右字數上節點對於跟節點

Python實現的遍歷

二叉樹的遍歷 終端 ini right name 一個 pan 樹的遍歷 二叉樹 二叉樹是有限個元素的集合,該集合或者為空、或者有一個稱為根節點(root)的元素及兩個互不相交的、分別被稱為左子樹和右子樹的二叉樹組成。 二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結

python-實現

__main__ 處理 後序 print binary pos 優先 pan 實現 # encoding=utf-8 class Node(object): def __init__(self, item): self.item = item

Python實現的非遞歸先序遍歷

結果 leetcode logs [] 列表 遍歷 不存在 preorder bin 思路: 1. 使用列表保存結果; 2. 使用棧(列表實現)存儲結點; 3. 當根結點存在,保存結果,根結點入棧; 4. 將根結點指向左子樹; 5. 根結點不存在,棧頂元素出棧,並將根結點指

Python實現的建立以及遍歷(遞迴前序、中序、後序遍歷,隊棧前序、中序、後序、層次遍歷)

class Node: def __init__(self,data): self.data=data self.lchild=None self.rchild=None class Tree: def __init__(se

python實現深度遍歷

1、什麼是深度優先遍歷       其實深度優先遍歷你可以把它看成是前序遍歷,比如對於如下二叉樹:               其深度遍歷的結果是:1,2,4,8,9,5,3,6,7

python實現層次遍歷(寬度優先遍歷或叫廣度優先遍歷)

1、何為層次遍歷       說白了,就是一層一層、由上至下、由左至右的搜尋遍歷二叉樹中的元素。                上面這個二叉樹,那麼層次遍歷的輸出應該是:1、2、

Python實現相關

程式碼如下: class Node(object): """""" def __init__(self, item): self.elem = item self.lchild = None self.rchild = No

python實現及其遍歷

class Node(): def __init__(self,data=-1): self.data=data self.left=None self.right=None class Tree(): def __init__(

python 實現

以上為按層次生成的二叉樹。 關於二叉樹簡單的操作包括二叉樹節點的定義、二叉樹的生成、二叉樹的前序遍歷、中序遍歷、後序遍歷。 1.首先關於節點的定義: """ @ python 二叉樹及其遍歷 @ author: blackzero """ ''' 1. 首先定義樹節點的

利用python實現

樹的基本概念 - 樹的節點不能形成迴路 - 森林是由多個數組成 樹形結構的專有名詞介紹 度數:每一個節點的所有子樹的個數 層數:樹的層數 高度:樹的最大層數 樹葉或終端節點:度數為零的節點 父節點:與這個節點有連結的上一層節點 子節點:每

python實現 的前序中序後序遍歷層次遍歷——遞迴與非遞迴

前序遍歷 # ------ coding:utf-8 ------- class TreeNode: def __init__(self, x): self.val = x

python 實現的深度&&廣度優先遍歷

本文首發於公眾號「zone7」,關注獲取最新推文! 概述 前言 什麼是樹 什麼是二叉樹 深度優先 廣度優先 後記 前言 前面說到演算法被虐了,這回我要好好把它啃下來。哪裡跌倒就要從哪裡站起來。這是我複習演算法與資料結構時的小筆記,這裡就 po 出來,給大家

Python實現"的層次遍歷||"的一種方法

給定一棵二叉樹,返回從上到下按層級順序遍歷結點的值(例如,從葉子節點的層級到根結點的層級) 例如: 二叉樹[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它從下到上按層級順序遍歷的

Python實現,前後中序層次遍歷,並按層次列印

樹 二叉樹的實現及遍歷 # -*- coding:utf-8 -*- ''' 用Python實現樹,並遍歷。 ''' class Node(): def __init__(self, x): self.val = x

python實現排序

一 程式碼 classBTree: def __init__(self,value): self.left =None self.data = value

Python實現及其4種遍歷

Python & BinaryTree 1. BinaryTree (二叉樹) 二叉樹是有限個元素的集合,該集合或者為空、或者有一個稱為根節點(root)的元素及兩個互不相交的、分別被稱為左子樹和右子樹的二叉樹組成。 二

python實現及相關操作

最近秋招差不多結束了,這幾個月複習了不少東西,記錄一下用python構造二叉樹以及相關的操作,與二叉樹相關的操作大多數都可以用遞迴的方法來解決。本文將記錄二叉樹的前序遍歷、中序遍歷、後序遍歷、層次

Python實現的層次遍歷及按層輸出的兩種方法

二叉樹的層次遍歷 二叉樹的層次遍歷即從上往下、從左至右依次列印樹的節點。 其思路就是將二叉樹的節點加入佇列,出隊的同時將其非空左右孩子依次入隊,出隊到佇列為空即完成遍歷。 # -*- coding:utf-8 -*- # class TreeNode: #

Python實現非遞迴遍歷及繪製

前言 關於二叉樹的實現與遍歷,網上已經有很多文章了,包括C, C++以及JAVA等。鑑於python做為指令碼語言的簡潔性,這裡寫一篇小文章用python實現二叉樹,幫助一些對資料結構不太熟悉的人快速瞭解下二叉樹。本文主要通過python以非遞迴形式實現二叉樹