資料結構與演算法篇 二叉樹

2021-08-28 20:30:36 字數 4426 閱讀 8609

節點類定義

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,而度...