C 二叉鏈 二叉樹儲存

2022-09-06 11:42:30 字數 4292 閱讀 4902

template模板的知識

二叉樹的基本知識

感謝:鏈結

templatestruct binode;
node 結點

這個結構體就是用來儲存二叉鏈的每乙個節點的

表示這個節點所存的值

表示指向 左子樹 和 右子樹 的指標

這樣的結構能很好地存下二叉樹:

(具體的建樹方法會放在後面解釋)

template class bitree

~bitree()

//遍歷

void preorder()

void inorder()

void postorder()

void leverorder();

//樹的深度

int depth()

//葉子結點數量

void caculateleafnum()

//交換左右子樹

void swap()

private:

binode*root;//

binode*creat(binode*bt);

void release(binode*bt);

void preorder(binode*bt);

void inorder(binode*bt);

void postorder(binode*bt);

int depth(binode*root);

void caculateleafnum(binode* root);

void swap(binode*root);

};

這便是樹的主體

乙個 bitree 的類就代表一顆二叉樹

在這裡定義了一些之後會用到的函式以及建構函式和折構函式

這裡知道有這些東西即可

這裡則有一些 public 會用到的函式

以及這個樹的根節點

建構函式

在類中 是這樣寫的:

bitree()
構造這個樹是通過 creat 這個函式來實現的

creat_code:

template binode*bitree::creat(binode*bt)

return bt;

}

在講建構函式之前

還需要提一嘴其輸入方式

這裡是採用前序遍歷的方式進行輸入

同時還需要以 "#" 輸入葉子結點的空子結點

例子:cin:

知道了輸入的順序之後

**就變得好理解很多了

建立乙個結點的時候

首先輸入這個結點的值(就是 t)

若其值是 "#" 那就不繼續往下面創造新結點了

直接讓 bt 為 空指標

並把這個指標返回

若其值不為 "#"

那說明後面可能還有結點需要新增

就繼續在左右子結點上呼叫 creat函式

bt = new binode;
這行**可能還需要解釋一下

new 是用來開闢新的記憶體空間的關鍵字

這裡相當於開闢了乙個新的結點結構體

而 bt 存下了這個結點結構體的指標

折構函式

~bitree()
折構函式和建構函式一樣是用類名來作為函式名的

不過需要在前面加乙個 "~"

這個函式呼叫了 release 這個函式

templatevoid bitree::release(binode*bt)

}

這個函式因該很好理解

就是從上往下搜

從下往上刪

就不過多解釋了

這個分兩部分將

第一部分 : 前/中/後序遍歷

這些**原理相同 就隨便挑乙個講好了

template void bitree::preorder(binode*bt)

}

從 root結點 開始搜尋

如果不是空結點 那就直接輸出

然後往兩邊找

決定前中後的只在於

輸出與往兩側搜尋語句的順序

第二部分 : 層序遍歷

還是用這個圖

}這裡是用乙個陣列和兩個變數來實現了佇列的功能

接下來我們來模擬一下

這樣就可以實現層序遍歷了

code:

templateint bitree::depth(binode*root)

}

深度要找的是最深的葉子結點的層數

因此直接左右找取最大值即可

code:

templatevoid bitree::caculateleafnum(binode*root)
首先我們要知道葉子結點的特徵:

沒有兒子節點

(就是所有兒子節點都為 null)

所以左右搜找到無兒子 +1 即可

templatevoid bitree::swap(binode*root)

}

由於二叉鏈的本質就是指標的堆疊

因此直接交換指標的存值就可以了

#includeusing namespace std;

templatestruct binode;

template class bitree

~bitree()

//遍歷

void preorder()

void inorder()

void postorder()

void leverorder();

//樹的深度

int depth()

//葉子結點數量

void caculateleafnum()

//交換左右子樹

void swap()

private:

binode*root;

binode*creat(binode*bt);

void release(binode*bt);

void preorder(binode*bt);

void inorder(binode*bt);

void postorder(binode*bt);

int depth(binode*root);

void caculateleafnum(binode* root);

void swap(binode*root);

};int leaf_count = 0;

template binode*bitree::creat(binode*bt)

return bt;

}templatevoid bitree::release(binode*bt)

}template void bitree::preorder(binode*bt)

}templatevoid bitree::inorder(binode*bt)

}templatevoid bitree::postorder(binode*bt)

}templatevoid bitree::leverorder()

}templateint bitree::depth(binode*root)

}templatevoid bitree::caculateleafnum(binode*root)

templatevoid bitree::swap(binode*root)

}int main()

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...