9 二叉樹簡單實現

2022-09-19 15:03:10 字數 2920 閱讀 3236

多叉樹轉換成二叉樹:左孩子右兄弟

從根節點、左下方開始,節點左側放自己左側的孩子,右側放自己右側的兄弟。

二叉樹滿二叉樹

一顆深度為k且有(2的k次方減1)個節點

完全二叉樹

除最後一層外,每一層上的節點數均達到最大值;在最後一層只缺少右邊的若干節點。

示意圖

遍歷

先序遍歷:根 左 右(遍歷順序)

中序遍歷:左 根 右

後序遍歷:左 右 根

要實現的介面

遍歷、葉子的數量、樹的高度(層數)、拷貝
在介面實現時,一般使用遞迴來遍歷樹。

二叉樹中每個節點都有左孩子節點和右孩子節點(可能為null),函式的引數是乙個節點的指標,函式內將引數做根節點使用,函式內呼叫遞迴時,傳入自身的孩子節點,則相當於下一層的呼叫會將自身的孩子節點當作根節點,層層遞迴。從巨集觀上,就是樹一層一層的遍歷。

#include#include//樹的節點

struct mybinarytree;

//遍歷列印

//利用遞迴,先序遍歷:根 左 右

void foreachprint(struct mybinarytree* b)

//這三條語句的順序,決定了樹的遍歷順序

//這裡的遍歷順序是根、左、右

printf("%c ",b->ch); //列印,可以換成其他的處理函式

foreachprint(b->lchild);

foreachprint(b->rchild);

}//葉子數量

//左右都為null的節點稱為葉子

void getleaf(struct mybinarytree* b,int* nums)

if(null==b->lchild && null==b->rchild)

getleaf(b->lchild, nums);

getleaf(b->rchild, nums);

}//樹的高度(層數)

int getheight(struct mybinarytree* b)

int lheight = getheight(b->lchild);

int rheight = getheight(b->rchild);

return lheight>rheight ? lheight+1 : rheight+1;

}//拷貝樹(但是作用域還是之前資料的)

struct mybinarytree* copybinarytree(struct mybinarytree* b)

struct mybinarytree* lchild = copybinarytree(b->lchild);

struct mybinarytree* rchild = copybinarytree(b->rchild);

struct mybinarytree* newnode = malloc(sizeof(struct mybinarytree));

newnode->lchild = lchild;

newnode->rchild = rchild;

newnode->ch = b->ch;

return newnode;

}//釋放樹

void freebinarytree(struct mybinarytree* b)

freebinarytree(b->lchild);

freebinarytree(b->rchild);

free(b);

}int main();

struct mybinarytree bt2 = ;

struct mybinarytree bt3 = ;

struct mybinarytree bt4 = ;

struct mybinarytree bt5 = ;

struct mybinarytree bt6 = ;

struct mybinarytree bt7 = ;

struct mybinarytree bt8 = ;

//按照順序將節點連線起來

bt1.lchild = &bt2;

bt1.rchild = &bt6;

bt2.rchild = &bt3;

bt3.lchild = &bt4;

bt3.rchild = &bt5;

bt6.rchild = &bt7;

bt7.lchild = &bt8;

foreachprint(&bt1);

printf("\n");

int leafnums = 0;

getleaf(&bt1, &leafnums);

printf("leaf nums=%d\n",leafnums);

printf("tree height=%d\n",getheight(&bt1));

newbt = copybinarytree(&bt1);

printf("-----------------\n");

foreachprint(newbt);

printf("\n");

leafnums = 0;

getleaf(newbt, &leafnums);

printf("leaf nums=%d\n",leafnums);

printf("tree height=%d\n",getheight(newbt));

return 0;

}

二叉樹 排序二叉樹的簡單實現

二叉樹 排序二叉樹 include using namespace std 二叉樹的節點 date 資料 left 指向二叉樹的左子樹 right 指向二叉樹的右子樹 template struct node template class btree public btree root null c...

二叉樹的簡單實現

本篇博文主要關注c 資料結構二叉樹的簡單實現,主要實現二叉樹類的構建,包括二叉樹的構造 拷貝構造 析構函式 賦值運算子的過載 前序中序後序層序遍歷二叉樹 查詢指定節點 查詢節點的總個數等功能函式,主要依靠遞迴演算法完成。樹的結點型別主要是根結點,指向右孩子的指標和指向左孩子的指標。下面是結點的建構函...

C 實現簡單二叉樹

二叉樹是重要的資料結構,這裡用c 簡單實現,暫時不考慮其增加 刪除和修改。二叉樹在底層其實就是用陣列儲存,可以用陣列實現二叉樹 首先建立乙個結構體,在其中儲存指標以及資料,這個結構體作為二叉樹的節點使用 template t struct binarytreenode 定義節點 然後就可以利用陣列建...