二叉樹的建立 遍歷1 建立二叉樹

2021-09-29 15:11:46 字數 2462 閱讀 2533

談二叉樹,如果二叉樹都沒有正確的建立出來,那豈不是紙上談兵!!

括號表示式:

表示方法:

1.括號:括號內的東西是括號前的元素的孩子

2.逗號:逗號是為了區分左右孩子

演算法分析:

給出乙個如上的括號表示式:a(b(d(,g)),(e,f)),再利用棧這個資料結構,分析一下:

掃瞄整個括號表示的字串,這個字串中只有四種字元:'(',')',',','other'

①:如果遇到了』(』:表示前面剛剛建立的節點是有孩子節點的,需要把它壓入棧中,因為我們的棧的功能實際上是為了儲存父節點而便於去尋找孩子節點,然後開始建立孩子節點,第乙個建立的一定是左孩子,所以設乙個控制左右孩子的變數:k = 0;//k = 0 時是左孩子,k = 1 是右孩子

②:如果遇到了』)』:表示以棧頂元素為根節點的子樹建立完畢,退出棧中

③:如果遇到了』,』:表示左孩子建立完畢,需要建立右孩子,此時k = 1//改變建立物件的狀態

④:如果遇到了其他元素,也就是遇到了節點的內容,此時我們應該建立節點,並且根據當前需要建立的是左孩子還是右孩子,有選擇有方向的去建立當前的節點並準確與其父節點鏈結

核心**展示:

const

int maxn =

1005

;char str[maxn]

;struct btnode

;btnode*

creatbt

(btnode *

&root)

} ch = str[

++j];}

return root;

}

**分析:

這裡貫徹了乙個思想:棧與佇列在二叉樹的操作中起到的作用就是儲存根節點以便於查詢子節點

然後注意一下指標操作:一開始初始化的時候,一定要把所有未操作卻已經定義了的指標指向null!

之前括號表示法建立二叉樹利用了棧的結構,這裡我們要運用佇列的結構

問題引入:

上面這幅圖,用層序遍歷得到的結果是:5 4 8 11 # 13 4 7 2 # # # 1

那如果我們得到上面這個序列,如何還原建立出二叉樹呢?

給出乙個層序結果,為空的地方是用『#』表示,我們可以借助乙個佇列,來儲存根節點,以便於鏈結它的對應子樹,然後設定乙個判定當前子樹是左還是右的標記:book,如果book % 2 = 0則是左子樹,反之則是右子樹,演算法步驟如下:

①:先讓5入隊,建立起第一層(根),然後把book設為0,表示接下來該建立左子樹了

②:在佇列不為空的情況下,取出隊首元素,然後開始準備連上它的左右孩子,這時會有兩種情況,一種是當前的book是奇數,這種情況是要新增左孩子,否則新增右孩子,然後在新增孩子的時候還需要判斷這個孩子是否是存在的,如果是『#』則是不存在,給當前的這個孩子賦予乙個null,否則就連上這個孩子,並且把這個孩子push入隊,因為它還可能是其他孩子的父親!然後處理完左右孩子之後,我們才pop隊首!

btnode*

creatbt2

(btnode *

&root)

}else

q.pop();

} book++;}

return root;

}

只能通過:

①:已知前序序列 + 已知中序序列 => 唯一建樹

②:已知中序序列 + 已知後序序列 => 唯一建樹

然而,已知前序和後序是不能唯一建樹的,這個隨便舉個例子就能得出,不做贅述

建樹的過程如下:以已知前中序推導後序為例

前序遍歷的乙個數是整棵樹的根,然後在中序序列中找到根的對應位置,分治遞迴,找到每乙個節點,建樹

void

creatbt3

(btnode *

&root,

int&pos,

int l,

int r)if(

-1== flag)

return

; root =

new btnode;

root-

>data = in[flag]

; root-

>lchild = root-

>rchild =

null

; pos++;if

(flag > l)

creatbt3

(root-

>lchild, pos, l, flag -1)

;` if

(flag < r)

creatbt3

(root-

>rchild, pos, flag +

1, r)

;}

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...

二叉樹建立 遍歷

include include include include using namespace std typedef struct node char ch struct node lchild,rchild bitnode,bitree int treenum 0 總結點數 void creat...

二叉樹 二叉樹遍歷 根據先序建立二叉樹

題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結輸入 輸入包括1行字串,長度不超過100。輸出 可能有多組測試資...