二叉樹的建立與相關操作

2021-08-11 09:05:56 字數 3934 閱讀 9691

二叉樹的建立與相關操作

1、二叉樹:是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。

如圖:

2、二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。

3、二叉樹的第i層至多有2^(i-1)個結點;深度為k的二叉樹至多有2^k-1個結點;對任何一棵二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。

4、一棵深度為k,且有2^k-1個節點稱之為

滿二叉樹

(如上圖);深度為k,有n個節點的二叉樹,當且僅當其每乙個節點都與深度為k的滿二叉樹中,序號為1至n的節點對應時,稱之為

完全二叉樹。

如下圖:

一、建立二叉樹

假設我們要建立乙個二叉樹:

對應陣列為:char array = "abc##d##ef##g";

這是因為以下程式中設定無效值為『#』,在遞迴的過程中,遇到無效值則置為null。

**如下:

// 根+左子樹+右子樹 

pnode _createbintree(const t* array, size_t size, size_t& index, const t& invalid)

return root;

}

在判斷語句中,最好將index二、前中後遍歷二叉樹

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

// 根--->根的左子樹---->根的右子樹

void _preorder(pnode& proot)

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

// 左子樹--->根節點--->右子樹 

void _inorder(pnode proot)

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

// 左子樹--->右子樹--->根節點 

void _postorder(pnode proot)

三、層序遍歷二叉樹

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

這裡遞迴很難實現,我們利用了佇列的特性,建立乙個佇列,先將根節點入隊,將隊頭的資料列印並出隊,再看左右節點,如果左節點不為空,將左節點入隊,如果右節點不為空,將右節點入隊。

**如下:

void _leverorder(pnode proot)

}

四、求二叉樹的高度

先求出左子樹的高度,和右子樹比較。

size_t _height(pnode proot)

五、求二叉樹中節點的個數

size_t _size(pnode proot)

六、求葉子節點的個數

size_t _getleafcount(pnode proot)

七、求二叉樹中第k層節點的個數

size_t _getklevelcount(pnode proot, int k)

八、求乙個節點的雙親節點,及左、右孩子節點。

pnode _parent(pnode proot, pnode pnode)

if (proot->_right)

return proot;

}

pnode leftchild(pnode pnode)

pnode rightchild(pnode pnode)

還有一些輔助函式,比如尋找某一元素所在節點。

整體**如下:

#includeusing namespace std;

#include#includetemplatestruct treenode

};templateclass bintree

bintree(const t* array, size_t size, const t& invalid)

bintree(const bintree& bt)

bintree& operator=(const bintree& bt)

~bintree()

void preorder()

void inorder()

void postorder()

void levelorder()

size_t size()

size_t getleafcount()

// 獲取第k層結點的個數

size_t getklevelcount(size_t k)

size_t height()

pnode find(const t& data)

pnode parent(pnode pnode)

pnode leftchild(pnode pnode)

pnode rightchild(pnode pnode)

private:

// 根+左子樹+右子樹

pnode _createbintree(const t* array, size_t size, size_t& index, const t& invalid)

return root;

} pnode _copybintree(pnode proot)

return *this;

} void _destroybintree(pnode proot) }

// 根--->根的左子樹---->根的右子樹

void _preorder(pnode& proot)

// 左子樹--->根節點--->右子樹

void _inorder(pnode proot)

// 左子樹--->右子樹--->根節點

void _postorder(pnode proot)

//層次遍歷

void _leverorder(pnode proot) }

size_t _size(pnode proot)

size_t _getleafcount(pnode proot)

size_t _height(pnode proot)

pnode _find(pnode proot, const t& data)

if (proot->_right)

}pnode _parent(pnode proot, pnode pnode)

if (proot->_right)

return proot;

} size_t _getklevelcount(pnode proot, int k)

private:

pnode _proot;

};

int main()

結果如下:

我們來比對看一下結果,正確。

二叉樹 二叉樹的相關操作

遞迴實現 建立求樹高 求葉子數 求節點數 統計度為2的結點個數 後序輸出 先序輸出 中序輸出 交換左右子樹 include include include define true 1 define false 0 define ok 1 define error 0 define overflow ...

二叉樹相關操作

include using namespace std typedef struct btnode btnode btnode newnode int value 非遞迴 btnode nodesearch btnode root,btnode parent,int value 遞迴 btnode ...

二叉樹的建立與相關運算

以廣義表的形式輸入二叉樹,建立二叉鍊錶,完成如下功能 1 三種遞迴遍歷 2 計算並輸出單分支節點,雙分支結點,葉子結點及其個數。3 把任 種遞迴演算法改為非遞迴演算法。4 輸出二叉樹的樹高。5 在二叉樹中查詢給定值的節點,若找到則輸出從根到該節點的路徑。否則,輸出找不到。include stdafx...