節點類定義
class node:
def __init__(self,val):
self.val=val
self.left=none
self.right=none
前序、中序、後序遍歷的遞迴、非遞迴
#前序**,中後續遍歷,改變print的位置即可
def pre(root):
if not root:
return
print(root.val)
pre(root.left)
pre(root.right)
#前中續遍歷**,後序**為前序向右遍歷,再反向
def pre_(root):
stack=
node=root
while node or stack:
while node:
print(node.val)#前序
node=node.left
node=stack.pop()
#print(node.val) 中序**
node=node.right
深度搜尋dfs,遞迴與非遞迴
def depth_tree(root):
if root:
print(root.val)
if root.left:
return depth_tree(root.left)
if root.right:
return depth_tree(root.right)
def depth(root):
if not root:
return
stack=[root]
while stack:
a=stack.pop(0)
if a.right:
stack.insert(0,right)
if a.left:
stack.insert(0,a.left)
#廣度優先改stack為deque
最大、最小深度,最大寬度
def maxdepth(root):
depth=0
if root:
left=maxdepth(root.left)
right=maxdepth(root.right)
depth=max(left,right)+1
return depth
def depth(root):
if not root:
return 0
a=[root]
d=0while a:
b=for node in a:
if a.left:
if a.right:
a=bd+=1
return d
def mindepth(root):
if not root:
return 0
left=mindepth(root.left)
right=mindepth(root.right)
if left==0 or right==0:
return left+right+1
return min(left,right)+1
#每一層非空節點數的話在最大深度**中,求b的長度即可
#此**最大寬度定義為一層中兩個非空節點間的節點個數,包括none,leetcode 662,
def width(root):
queue=[(root,0,0)]
curdepth=ans=left=0
for node.depth,pos in queue:
if node:
if curdepth!=depth:
left=pos
curdepth=depth
ans=max(ans,pos-left+1)
return ans
最低公共祖先
def lowest(root,a,b):
if not root or root==a or root==b:
reutrn root
left=lowest(root.left,a,b)
right=lowest(root.right,a,b)
if left and right:
return root
if not left:
return right
if not right:
return left
return none
樹的所有路徑(根到葉節點),樹的所有路徑中(根到節點)等於某個值,依然借助stack結構,在bfs的基礎上增加乙個陣列記錄路徑
#遞迴
def path(root):
if not root:
return
if not root.left and not root.right:
return [str(root.val)]
return [str(root.val)+'-'+i for i in path(root.left)]+[str(root.val)+'-'+j for j in path(root.right)]
#非遞迴
def path(root):
if not root:
retrun
res,stack=,[(root,'')]
while stack:
node,ls=stack.pop()
if not node.left and not node.right:
if node.left:
if node.right:
return res
def findpath(root,num):
a=[root]
result=[[root.val]]
r= while a:
temp=a.pop()
i=result.pop()
if temp.left:
if temp.right:
if not temp.left and not temp.right and sum(i)==num:
return r
字典樹
class trienode:
def __init__(self):
self.data={}
def insert(root,word):
for i in word:
child=root.data.get(i)
if not child:
root.data[child]=trienode()
root=root.data[child]
哈夫曼樹
import heapq
def make_hufftree(inlist):
trees=list(inlist)
heapq.heapify(trees)
while len(trees)>1:
parentnode=(leftchild[0]+rightchild[0],leftchild,rightchild)
class node(object):
def __init__(self,i):
self.weight=i
self.left=none
self.right=none
def sort(l):
return l.sort(key=lambda node:node.weight)
def hufftree(l):
sort(l)
while len(l)>1:
a=l.pop(0)
b=l.pop(0)
c=node(a.weight+b.weight)
c.left=a
c.right=b
sort(l)
return l
判斷兩棵樹是否相同
class solution:
def issametree(self, p, q):
if not p and not q:
return true
if not q or not p:
return false
if p and q:
if p.val!=q.val:
return false
else:
return self.issametree(p.left,q.left) and self.issametree(p.right,q.right)
演算法與資料結構 二叉樹
二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...
資料結構與演算法 二叉樹
1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...
資料結構與演算法 二叉樹
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...