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以非遞迴形式實現二叉樹