1. 程式人生 > >二叉樹的初步實現

二叉樹的初步實現

二叉樹的初步實現,寫了有一段時間了,先放出來,然後,有時間的話,會寫圖解以及註釋的,如果有大神發現不足之處,希望可以幫我指出來,感激不盡!

//本程式的目的是利用連結串列實現二叉樹,並且實現先序遍歷,中序遍歷,後序遍歷
#include<iostream>
using namespace std;

//二叉樹的結點
template<class T>
class BinaryTreeNode
{
public:
    BinaryTreeNode<T>* leftnode;            //左邊的結點
    BinaryTreeNode<T>* rightnode;            //
右邊的結點 T content; //結點中內容 }; //建立二叉樹,利用遞迴從左到右建立,如果輸入-1則表示該結點為空 //建立二叉樹函式的模組的思路是在csdn上找到的思路,利用遞迴函式建立, //關於建立二叉樹也有三種遞迴的思路,分別為先序,中序,後序,每種演算法輸入時也會出現不同的儲存結果 //這裡一定要注意 //先序的思路 template<class T> void PreCreatBinaryTree(BinaryTreeNode<T>*&head) { //------首先判斷輸入的內容是否為-1,如果為-1那麼返回上一層
//臨時變數,用來儲存輸入的內容 T linshi; cout << "請輸入值:"; cin >> linshi; if (linshi == -1) { //如果輸入的是#號,那麼當前指標指向空引數 head = NULL; } //如果輸入的不是#號,那麼,做相應的操作 else { //為當前head指標建立新的結點 head = new BinaryTreeNode<T>; //為當前結點的內容賦值 head->content = linshi;
//用當前左兒子的結點作引數,再次呼叫CreatBinaryTree()函式 CreatBinaryTree(head->leftnode); //用當前右兒子的結點做引數,再次呼叫CreatBianryTree()函式 CreatBinaryTree(head->rightnode); } } //建立二叉樹中序的思路 template<class T> void InCreatBinaryTree(BinaryTreeNode<T>*&head) { //T為臨時變數,用來儲存輸入的值 T linshi; cout << "請輸入值:"; cin >> linshi; //判斷輸入值是否為-1,如果為-1,那麼當前結點的指標為空,返回上一層,如果不為-1,執行相應操作 if (linshi == -1) { head = NULL; return; } //如果不為-1,執行相應的操作 else { //為當前結點建立新的空間 head = new BinaryTreeNode<T>; //以當前結點的左指標為引數,呼叫InCreatBinaryTree()函式 InCreatBinaryTree(head->leftnode); //為當前結點賦值 head->content = linshi; //以當前結點的右指標為引數,呼叫InCreatBinaryTree()函式 InCreatBinaryTree(head->rightnode); } } //建立二叉樹後序的思路 template<class T> void PostCreatBinaryTree(BinaryTreeNode<T>*&head) { //為當前結點分配新的記憶體s head = new BinaryTreeNode<T>; //臨時變數,用來儲存輸入的值,如果為-1,那麼當前結點為空,返回上一層,如果不為-1,執行相應操作 T linshi; //輸入數值 cout << "請輸入數值:"; cin >> linshi; //如果輸入值為-1,那麼當前結點為空,返回上一層 if (linshi == -1) { //設定當前結點為空 head = NULL; //返回上一層 return; } //如果不為空,那麼執行相應操作 else { //為當前結點建立新的記憶體空間 head = new BinaryTreeNode<T>; //以當前結點的左結點為引數呼叫PostCreatBinarry()函式 PostCreatBinaryTree(head->leftnode); //以當前結點的右結點為引數呼叫PostCreatBinarry()函式 PostCreatBinaryTree(head->rightnode); //為當前結點的內容賦值 head->content = linshi; } } //輸出二叉樹結點,利用遞迴,先序遍歷 template<class T> void PreorderTraversal(BinaryTreeNode<T>*head) { if (head == NULL) return; else { //輸出當前結點 cout << head->content << " "; //以當前結點的左結點為引數,再次呼叫PrintBinaryTree()函式 PreorderTraversal(head->leftnode); //以當前結點的右結點為引數,再次呼叫PrintBinaryTree()函式 PreorderTraversal(head->rightnode); } } //輸出二叉樹結點,利用遞迴,中序遍歷 template<class T> void InorderTraversal(BinaryTreeNode<T>*head) { if (head == NULL) return; else { //以當前結點的左結點為引數,呼叫InorderTraversal()函式 InorderTraversal(head->leftnode); //輸出當前結點的內容 cout << head->content << " "; //以當前結點的右結點為引數,呼叫InorderTraversal()函式 InorderTraversal(head->rightnode); } } //輸出二叉樹結點,利用遞迴,後序遍歷 template<class T> void PostorderTraversal(BinaryTreeNode<T>*head) { //如果結點為空,返回上一層 if (head == NULL) return; //如果不為空,執行相應的操作 else { //以當前結點的左結點為引數,呼叫PostorderTraversal()函式 PostorderTraversal(head->leftnode); //以當前結點的右結點為引數,呼叫PostorderTraversal()函式 PostorderTraversal(head->rightnode); //輸出當前結點的內容 cout << head->content << " "; } } //銷燬二叉樹,利用遞迴,後序遍歷(銷燬是用後序遍歷,如果用先序遍歷或者中序遍歷會使樹斷掉) //關於銷燬二叉樹的函式讓我十分驚喜,因為,他可以將頭節點一併刪除 template<class T> void DestoryBinaryTree(BinaryTreeNode<T>* &head) { //如果結點為空,返回上一層結點 if (head == NULL) return; //如果結點不為空,執行相應操作 else { //除錯資訊 BinaryTreeNode<int>*head1 = head; //以當前結點的左結點為引數,呼叫DestoryBinaryTree()函式 DestoryBinaryTree(head->leftnode); //以當前結點的右結點為引數,呼叫DestoryBinaryTree()函式 DestoryBinaryTree(head->rightnode); //銷燬當前結點 delete head; } } //主函式 int main() { BinaryTreeNode <int>*a = new BinaryTreeNode<int>; PostCreatBinaryTree(a); cout << "先序輸出:"; PreorderTraversal<int>(a); cout << endl; cout << "中序輸出:"; InorderTraversal<int>(a); cout << endl; cout << "後序輸出:"; PostorderTraversal<int>(a); cout << endl; //銷燬二叉樹 DestoryBinaryTree<int>(a); //銷燬新建立的二叉樹結點 //delete a; system("pause"); return 0; }