二叉樹建立與遍歷

2021-08-09 10:03:49 字數 3436 閱讀 3529

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱為」左子樹」和」右子樹」。二叉樹的每個節點最多只能右兩棵子樹,子樹有左右之分,次序不能顛倒。

除了葉結點外每乙個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

假設二叉樹的高度為k,除第k層外,其他各層的節點數都達到最大個數。也就是第一層到第k-1層為乙個滿二叉樹。第k層有葉子節點,並且葉子結點都是從左到右依次排列。

它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

假如我們要建立的二叉樹是這樣的

在這裡給出乙個陣列:

arr =

我們使用遞迴從根節點開始排列,然後放入它的左節點,再將它的左節點當作根節點依次排列,當碰到』#』時,則置為 null並返回到上一層節點,這時處理該節點的右節點,如果碰到』#』置null並返回,一直重複進行,直到讀完本陣列。

binarytreenode*leftchild; //左節點

binarytreenode*rightchild; //右節點

};// 1 2 3 # # 4 # # 5 6

templateclass binarytree

binarytree(t* a, size_t n,const t &invalid)

protected:

node * checktree(t *a, size_t n, const t& invalid, size_t &index)

return t;

}private:

node* _root;

};1.前序遍歷

遞迴實現

首先訪問根,再前序遍歷左子樹,最後前序遍歷右子樹

public:

//4種遍歷

void prevorder() //巢狀達成封裝

private:

void _prevorder(node *root) //前序遍歷

cout << root->_data<<

" "; //先輸出根節點

_prevorder(root->leftchild); //左節點

_prevorder(root->rightchild); //右節點

}

非遞迴實現

先壓入根節點,並列印根節點,然後訪問根節點的左節點,如果不為空,則列印左節點,再訪問左節點的左節點。一直迴圈下去,直到下一左節點為空,則應該進行出棧並訪問該節點的右節點。如果該節點的右節點為空,則應該再次出棧訪問該節點的上一節點的右子樹。依次迴圈。

實現:

tailprint(node *head)

//2.取棧裡面節點的右子樹 如果右子樹未訪問。

node * top=s.top(); 2

s.pop();

cur=top->rightchild;}}

2.中序遍歷

遞迴實現

首先中序遍歷左子樹,再訪問根,最後中序遍歷右子樹。

public:

void _in0rder() //巢狀實現封裝

private:

void inorder(node *root)

inorder(root->leftchild);

cout << root->_data <<

" ";

inorder(root->rightchild);

}

非遞迴實現

中序遍歷與前序類似,是先訪問所有的左節點但是不列印,直到左節點為空是表明到達左子樹的下面,這時需要列印出棧並訪問當前節點的右子樹,如果右為空就出棧,訪問上一節點的右子樹,如果不為空就繼續遍歷。

//當為空時,說明已經到達左子樹最下邊,這時需要出棧了

if (!in.empty())}}

3.後序遍歷

遞迴遍歷

首先後序遍歷左子樹,再後序遍歷右子樹,最後訪問根。

public:

void _postorder() //巢狀實現封裝

private:

void postorder(node *root) //後序遍歷

postorder(root->leftchild);

postorder(root->rightchild);

cout << root->_data<<

" ";

}

非遞迴遍歷

後序遍歷也是先訪問到左子樹的最下面,訪問之後應該先訪問右節點再訪問根節點,而訪問根節點的前提是,根節點無右子樹或右子樹已經被訪問過,所以需要乙個點用來儲存訪問過的右子樹。進入右子樹,若右子樹不為空,則開始遍歷右子樹的左節點,依次迴圈遍歷。

//若左子樹剛被訪問過,則需先進入右子樹(根節點需再次入棧)

else}}

cout

<< endl;

}4.層序遍歷:

即按照層次訪問,訪問根,訪問子女,再訪問子女的子女。

此時用遞迴發現會很難實現,便改用迴圈和佇列實現層序遍歷。

方法:

建立乙個佇列,先將根節點入隊,進入迴圈,將隊頭的資料列印並出隊,如果左節點不為空,將左節點入隊,如果右節點不為空,將右節點入隊。

重複迴圈內的操作。

實現:

void levelorder(node *root)    //利用佇列

if (front->rightchild != null) }}

二叉樹建立與遍歷

節點定義 class binnode binnode char data2 data data2 binnode char data2,binnode parent2 data data2 void insertasleft char data void insertasright char dat...

二叉樹的建立與遍歷 二叉樹遍歷模板)

初學二叉樹,感覺之前鍊錶掌握不熟練導致接受有點難,現在做一些總結。本題其實就是根據給出的前序遍歷 包括空子樹 寫出相應的前序 中序和後序遍歷。廢話不多說,先看看題目 description 下面給出了教材中演算法6.4所示的演算法。status createbitree bitree t retur...

二叉樹建立 遍歷

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