㈠ python二叉樹問題
def __init__(self ,value=3): # value = default_value
self.value = value
這樣就行了撒。
PS:以後貼代碼記得把縮進對齊。。。
㈡ python 二叉樹實現思想
第一 :return 的縮進不對 ,
ifself.root==None:
self.root=node
return#如果這里不縮進,下面的語句無意義,直接返回,不會執行。
while queue這個循環的作用的是從root根結點開始,向下查找第一個左(右)子結點為空的結點,將node插入這個位置,queue的作用是將查找到的非空子結點保存在queue中,然後依次向下查找這些子結點的左右子結點
㈢ 求Python二叉樹的幾個演算法 求幾個二叉樹的method! 1) 給一個值,然後在樹中找出該值
你好:
二叉樹演算法,網上是比較多的;
可能按照你的需求不是很多:
下面是我用的一個,不過你可以借鑒一下的:
#-*-coding:cp936-*-
importos
classNode(object):
"""docstringforNode"""
def__init__(self,v=None,left=None,right=None,parent=None):
self.value=v
self.left=left
self.right=right
self.parent=parent
classBTree(object):
"""docstringforBtTee"""
def__init__(self):
self.root=None
self.size=0
definsert(self,node):
n=self.root
ifn==None:
self.root=node
return
whileTrue:
ifnode.value<=n.value:
ifn.left==None:
node.parent=n
n.left=node
break
else:
n=n.left
ifnode.value>n.value:
ifn.right==None:
n.parent=n
n.right=node
break
else:
n=n.right
deffind(self,v):
n=self.root#http://yige.org
whileTrue:
ifn==None:
returnNone
ifv==n.value:
returnn
ifv<n.value:
n=n.left
continue
ifv>n.value:
n=n.right
deffind_successor(node):
'''查找後繼結點'''
assertnode!=Noneandnode.right!=None
n=node.right
whilen.left!=None:
n=n.left
returnn
defdelete(self,v):
n=self.find(v)
print"delete:",n.value
del_parent=n.parent
ifdel_parent==None:
self.root=None;
return
ifn!=None:
ifn.left!=Noneandn.right!=None:
succ_node=find_successor(n)
parent=succ_node.parent
ifsucc_node==parent.left:
#ifsucc_nodeisleftsubtree
parent.left=None
ifsucc_node==parent.right:
#ifsucc_nodeisrightsubtree
parent.right=None
ifdel_parent.left==n:
del_parent.left=succ_node
ifdel_parent.right==n:
del_parent.right=succ_node
succ_node.parent=n.parent
succ_node.left=n.left
succ_node.right=n.right
deln
elifn.left!=Noneorn.right!=None:
ifn.left!=None:
node=n.left
else:
node=n.right
node.parent=n.parent
ifdel_parent.left==n:
del_parent.left=node
ifdel_parent.right==n:
del_parent.right=node
deln
else:
ifdel_parent.left==n:
del_parent.left=None
ifdel_parent.right==n:
del_parent.right=None
deftranverse(self):
defpnode(node):
ifnode==None:
return
ifnode.left!=None:
pnode(node.left)
printnode.value
ifnode.right!=None:
pnode(node.right)
pnode(self.root)
defgetopts():
importoptparse,locale
parser=optparse.OptionParser()
parser.add_option("-i","--input",dest="input",help=u"helpname",metavar="INPUT")
(options,args)=parser.parse_args()
#printoptions.input
return(options.input)
if__name__=='__main__':
al=[23,45,67,12,78,90,11,33,55,66,89,88,5,6,7,8,9,0,1,2,678]
bt=BTree()
forxinal:
bt.insert(Node(x))
bt.delete(12)
bt.tranverse()
n=bt.find(12)
ifn!=None:
print"findvalud:",n.value
㈣ 如何將數據存儲為二叉樹python
(1)二叉樹是有序樹,即使只有一個子樹,也必須區分左、右子樹;
(2)二叉樹的每個結點的度不能大於2,只能取0、1、2三者之一;
(3)二叉樹中所有結點的形態有5種:空結點、無左右子樹的結點、只有左子樹的結點、只有右子樹的結點和具有左右子樹的結點。
㈤ python二叉樹求深度的一個問題,有代碼,求解釋
這是遞歸演算法
我們可以先假設函數功能已經實現,left從左子樹拿到一個深度值,right從右子樹拿到一個深度值,最後,本層的深度為left和right的最大值加1,也就是最大深度值再算上自己這一層。
也可以從停止條件開始思考,什麼時候不再遞歸呢?當root為空時,並返回深度值為0。調用這一層的函數得到返回值就是0,我們假設這是左子樹left得到的值,同時假設右子樹也為空,所以right也為0。那麼返回給上一層的值就是left和right最大值加1,就是1,表示這個節點深度為1。同理,可以得到整棵樹深度。
㈥ python二叉樹演算法
定義一顆二叉樹,請看官自行想像其形狀
class BinNode( ):
def __init__( self, val ):
self.lchild = None
self.rchild = None
self.value = val
binNode1 = BinNode( 1 )
binNode2 = BinNode( 2 )
binNode3 = BinNode( 3 )
binNode4 = BinNode( 4 )
binNode5 = BinNode( 5 )
binNode6 = BinNode( 6 )
binNode1.lchild = binNode2
binNode1.rchild = binNode3
binNode2.lchild = binNode4
binNode2.rchild = binNode5
binNode3.lchild = binNode6
㈦ python二叉樹輸出結果為什麼是這樣
1. 二叉樹
二叉樹(binary tree)中的每個節點都不能有多於兩個的兒子。
圖 ((7+3)*(5-2))的表達式樹表示
2.1 根據中綴表達式構造表達式樹:
遍歷表達式:
1.建立一個空樹
2.遇到'(',為當前的Node添加一個left child,並將left child當做當前Node。
3.遇到數字,賦值給當前的Node,並返回parent作為當前Node。
4.遇到('+-*/'),賦值給當前Node,並添加一個Node作為right child,將right child當做當前的Node。
5.遇到')',返回當前Node的parent。
defbuildexpressionTree(exp):tree=BinaryTree('')stack=[]stack.append(tree)currentTree=treeforiinexp:ifi=='(':currentTree.insertLeft('')stack.append(currentTree)currentTree=currentTree.leftChildelifinotin'+-*/()':currentTree.key=int(i)parent=stack.pop()currentTree=parentelifiin'+-*/':currentTree.key=icurrentTree.insertRight('')stack.append(currentTree)currentTree=currentTree.rightChildelifi==')':currentTree=stack.pop()else:raiseValueErrorreturntree上述演算法對中綴表達式的寫法要求比較繁瑣,小括弧應用太多,例如要寫成(a+(b*c))的形式。
用後綴表達式構建表達式樹會方便一點:如果符號是操作數,建立一個單節點並將一個指向它的指針推入棧中。如果符號是一個操作符,從棧中彈出指向兩棵樹T1和T2的指針並形成一棵新的樹,樹的根為此操作符,左右兒子分別指向T2和T1.
123456789101112131415defbuild_tree_with_post(exp):stack=[]oper='+-*/'foriinexp:ifinotinoper:tree=BinaryTree(int(i))stack.append(tree)else:righttree=stack.pop()lefttree=stack.pop()tree=BinaryTree(i)tree.leftChild=lefttreetree.rightChild=righttreestack.append(tree)returnstack.pop()3.樹的遍歷
3.1 先序遍歷(preorder travelsal)
先列印出根,然後遞歸的列印出左子樹、右子樹,對應先綴表達式
12345678defpreorder(tree,nodelist=None):ifnodelistisNone:nodelist=[]iftree:nodelist.append(tree.key)preorder(tree.leftChild,nodelist)preorder(tree.rightChild,nodelist)returnnodelist3.2 中序遍歷(inorder travelsal)
先遞歸的列印左子樹,然後列印根,最後遞歸的列印右子樹,對應中綴表達式
12345definorder(tree):iftree:inorder(tree.leftChild)printtree.keyinorder(tree.rightChild)3.3 後序遍歷(postorder travelsal)
遞歸的列印出左子樹、右子樹,然後列印根,對應後綴表達式
1234567defpostorder(tree):iftree:forkeyinpostorder(tree.leftChild):yieldkeyforkeyinpostorder(tree.rightChild):yieldkeyyieldtree.key3.4 表達式樹的求值
1234567891011defpostordereval(tree):operators={'+':operator.add,'-':operator.sub,'*':operator.mul,'/':operator.truediv}leftvalue=Nonerightvalue=Noneiftree:leftvalue=postordereval(tree.leftChild)rightvalue=postordereval(tree.rightChild)ifleftvalueandrightvalue:returnoperators[tree.key](leftvalue,rightvalue)else:returntree.key㈧ python怎麼做二叉查找樹
可以的,和C++中類的設計差不多,以下是二叉樹的遍歷
class BTree:
def __init__(self,value):
self.left=None
self.data=value
self.right=None
def insertLeft(self,value):
self.left=BTree(value)
return self.left
#return BTree(value)
def insertRight(self,value):
self.right=BTree(value)
return self.right
def show(self):
print self.data
def preOrder(node):
node.show()
if node.left:
preOrder(node.left)
if node.right:
preOrder(node.right)
def inOrder(node):
if node:
if node.left:
inOrder(node.left)
node.show()
if node.right:
inOrder(node.right)
if __name__=='__main__':
Root=BTree('root')
A=Root.insertLeft('A')
C=A.insertLeft('C')
D=A.insertRight('D')
F=D.insertLeft('F')
G=D.insertRight('G')
B=Root.insertRight('B')
E=B.insertRight('E')
preOrder(Root)
print 'This is binary tree in-traversal'
inOrder(Root)
㈨ 設計計算二叉樹中所有節點值之和的演算法
使用深度優先搜索,遞歸遍歷二叉樹中的所有節點。用Python實現代碼如下:
deftreeSum(root):
ifrootisNone:
return0
returntreeSum(root.left)+treeSum(root.right)+root.val
㈩ Python編程求解二叉樹中和為某一值的路徑代
1、如果只有根節點或者找到葉子節點,我們就把其對應的val值返回
2、如果不是葉子節點,我們分別對根節點的左子樹、右子樹進行遞歸,直到找到葉子結點。然後遍歷把葉子結點和父節點對應的val組成的序列返回上一層;