二叉樹的建立與相關操作
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...