07 2 二叉數,二叉樹的簡單應用 表示式樹

2022-06-26 17:51:10 字數 3323 閱讀 6772

"""

二叉樹的list實現

"""def bintree(data, left=none, right=none):

"""二叉樹

:param data: 根結點的元素

:param left: 左子樹元素

:param right: 右子樹元素

:return:

"""return

[data, left, right]

defis_empty_bintree(btree):

return btree is

none

defroot(btree):

return

btree[0]

defleft(btree):

return btree[1]

defright(btree):

return btree[2]

defset_root(btree, data):

btree[0] =data

defset_left(btree, left):

btree[1] =left

defset_right(btree, right):

btree[2] =right

if__name__ == '

__main__':

t1 = bintree(2, bintree(4), bintree(8))

print(t1) #

[2, [4, none, none], [8, none, none]]

"""

二叉樹的簡單應用:表示式樹

"""#

表示式建構函式

defmake_sum(a, b):

return ('+'

, a, b)

defmake_prod(a, b):

return ('*'

, a, b)

defmake_diff(a, b):

return ('-'

, a, b)

defmake_div(a, b):

return ('/'

, a, b)

#是否是基本表示式,也就是數或者變數

defis_basic_exp(a):

return

notisinstance(a, tuple)

#判斷是否是數值

defis_number(x):

return isinstance(x, int) or isinstance(x, float) or

isinstance(x, complex)

defeval_sum(a, b):

if is_number(a) and

is_number(b):

return a +b

if is_number(a) and a ==0:

return

b

if is_number(b) and b ==0:

return

a

return

make_sum(a, b)

defeval_div(a, b):

if is_number(a) and

is_number(b):

return a /b

if is_number(a) and a ==0:

return

0

if is_number(b) and b == 1:

return

a

if is_number(b) and b ==0:

raise

zerodivisionerror

return

make_div(a, b)

defeval_diff(a, b):

if is_number(a) and

is_number(b):

return a *b

if is_number(a) and a ==0:

return

0

if is_number(b) and b == 1:

return

a

if is_number(a) and a == 1:

return

b

if is_number(b) and b ==0:

return

0

return

make_diff(a, b)

defeval_prod(a, b):

if is_number(a) and

is_number(b):

return a -b

if is_number(a) and a ==0:

return -b

if is_number(b) and b ==0:

return

a

return

make_prod(a, b)

defeval_exp(e):

ifis_basic_exp(e):

return

e

#遞迴處理子表示式

op, a, b = e[0], eval_exp(e[1]), eval_exp(e[2])

if op == '+'

:

return

eval_sum(a, b)

elif op == '*'

:

return

eval_diff(a, b)

elif op == '-'

:

return

eval_prod(a, b)

elif op == '/'

:

return

eval_div(a, b)

else

:

raise valueerror("

unknown operator:

", op)

el = make_prod(3, make_sum(2, 5))

print(el) #

('*', 3, ('+', 2, 5))

print(eval_exp(el)) #

21el1 = make_prod(3, make_sum(-2, 5))

print(el1) #

('*', 3, ('+', -2, 5))

print(eval_exp(el1)) #

9

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

二叉樹 二叉鍊錶

include using namespace std typedef char elemtype int n 0 typedef struct binode binode class bitree bitree binode getroot void preorder binode root 前序...

二叉樹的應用 二叉樹遍歷的應用

在以上討論的遍歷演算法中,訪問結點的資料域資訊,即操作visite bt data 具有更一般的意義,需根據具體問題,對bt 資料進行不同的操作。下面介紹幾個遍歷操作的典型應用。search bt,x 在bt 為二叉樹的根結點指標的二叉樹中查詢資料元素x。查詢成功時返回該結點的指標 查詢失敗時返回空...