構造二叉樹並實現訪問操作

2021-09-27 15:04:24 字數 4528 閱讀 4204

不理會題目,直接閱讀筆者構造樹的**不非常影響閱讀

題目

description

二叉樹是結點的乙個有限集合,該集合或者為空或者是由乙個根結點加上兩棵分別稱為左子樹和右子樹的、互不相交的二叉樹組成。

在定義樹結點時,你的結點node的屬性應包括node.elem, node.lchild和node.rchild等這三個屬性,其分別代表節點的資料,節點的左孩子和節點的右孩子,屬性的命名必須是elem、lchild和rchild。

同時,你需要根據輸入資料建立一棵名為mytree(注意大小寫)的二叉樹,該樹擁有的變數應至少包含名為root(如mytree.root)元素,代表該二叉樹的根節點。

注意:本題樹可能為空(樹為空的情形指第一行無任何輸入,即鍵入回車,空樹沒有任何結點)。

下面的**是本題的main函式部分,最後三句**的功能是執行輸入的n條命令,請在**塊的地方新增根據輸入的資料構造二叉樹mytree的**塊,注意**塊縮排的問題。

eval語句的功能是將接收到的字串轉換成命令並執行。

ifname==『main』:

n = int(input())

for i in range(n):

eval(input())

input

第一行字元表示要建立二叉樹的元素(元素之間以空格分開),第二行表示待執行語句的行數n,接下來n行表示待執行的語句。

二叉樹建立規則:按照完全二叉樹的編號方式(根節點從0開始,然後從左到右,從上到下依次編號),第一行內各元素對應的索引即為該元素在完全二叉樹中的位置,如樣例中a(索引為0)為儲存在根結點內的元素,特別注意『#』代表不存在該節點,因此實際的二叉樹中沒有以『#』為元素的結點。

output

建立二叉樹時無需輸出二叉樹;輸入命令時會依次在每行輸出相應命令的執行結果;當為空樹(即樹沒有結點)時,訪問該樹的根節點(即mytree.root)需輸出none;當訪問的節點不存在時,輸出none。

sample input 1

a c d f # 11

2print(mytree.root.rchild.lchild.elem)

print(mytree.root.lchild.lchild.elem)

sample output 111f

要點

之前的部落格提到**@property是讓接下來的function可以作為乙個屬性來用,但這只是讓它有了可讀性,@funtion.settter**這種語句的作用就是使得這個function具有可寫性,事實上object.function = value其實就是function(self,value)怎麼讓節點按完全二叉樹的順序插入呢,這其實就是乙個層次遍歷的問題,先構造乙個queue,先壓入目前樹的根節點,然後進入迴圈,使得第乙個元素出隊,第乙個元素就代表了以這個節點為根節點的一棵樹,若是該樹左孩子為空,那麼我們在這裡插入乙個節點,若否,檢查右節點,若否,說明左右子樹都存在,那麼我們依次把左子樹和右子樹入隊,迴圈進入下一輪。這就實現了層次插入。

題目中說到』#'代表這裡沒有節點,那麻煩大了,按我們要點2所講的方法,這個點沒有節點,也就是建立的時候跳過的話,下一輪的節點會在這個地方被插入,那就涼涼。因此我們照樣存它。只是我們在返回乙個node的e時候若是發現elem為』#』,我們就返回none。ifname==『main』: 是什麼意思呢,其實__name__的value就是你當前的檔案的名字,__main__就是執行檔案的名字,有些同學可能就說那這兩個不是乙個東西嗎。其實就是如果我們在這個檔案上執行,就是應該東西,所以下面的**會被執行,如果我們在其他檔案裡import這個檔案,那麼只會執行這個語句塊之外的語句,起到乙個保護作用。

coding:

class

node

(object):

def__init__

(self, lchild=

none

, rchild=

none

, elem=0)

: self._elem, self._lchild, self._rchild = elem, lchild, rchild

@property

defelem

(self)

:if self._elem is

'#':

return

none

return self._elem

@property

deflchid

(self)

:return self._lchild

@property

defrchild

(self)

:return self._rchild

@elem.setter

defelem

(self, elem)

: self._elem = elem

@lchid.setter

deflchild

(self, lchild)

: self._lchild = lchild

@rchild.setter

defrchild

(self, rchild)

: self._rchild = rchild

class

bintree

(object):

def__init__

(self, elem=

none):

if elem is

notnone

: self.root = node(

none

,none

, elem)

else

: self.root =

none

def(self, elem)

:if self.root is

none

: self.root = node(

none

,none

, elem)

else

: queue =

[self.root]

while

len(queue)

>0:

cur = queue.pop(0)

if cur.lchild is

none

: cur.lchild = node(

none

,none

, elem)

return

elif cur.rchild is

none

: cur.rchild = node(

none

,none

, elem)

return

else

:def

layer_order

(self)

:if self.root is

none

:print

('none'

)else

: queue =

[self.root]

while queue:

node = queue.pop(0)

print

(node.elem)

if node.lchild is

notnone

:if node.rchild is

notnone

:if __name__ ==

'__main__'

:#####################################

# 接收處理第一行資料並構造樹的**區域 #

mytree = bintree(

) temp_list =

list

(input()

.split(

" ")

)if temp_list !=[''

]:for i in

range

(len

(temp_list)):

)#####################################

# mytree.layer_order()

n =int(

input()

)for i in

range

(n):

eval

(input()

)

二叉樹構造

題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。public int findvalptr vectorarr,int val return i 查詢子樹的根節點 publi...

構造二叉樹

題目 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 理解從前序中可以直接找到根節點,然後從中序中找到這個根節點並...

構造二叉樹

例 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 二叉樹 3 9 20 15 7 definition for a binary tree node.struct treenode class solution treenode buildtr...