二叉樹的C語言實現及遍歷

2021-10-17 05:52:40 字數 2419 閱讀 6443

樹是一種十分重要的基礎資料結構。很多實際問題都會抽象成樹來解決。而這篇文章要講的二叉樹則是樹中最基本又很重要的一種特殊樹。它只的是每個節點的度不大於2的樹。

基於二叉樹還有很多衍生的樹。查詢樹,紅黑樹,平衡樹等等等等。

二叉樹可以很形象的看做是乙個遞迴的產物。所以二叉樹的問題,基本都可以用遞迴來解決。無論一顆二叉樹是什麼樣子的。他都可以看做三部分:本節點,左子樹,右子樹。

左子樹也可以看成本節點,左子樹,右子樹。這樣的結構。

就像上這樣。所以乙個樹的節點需要三部分。儲存本節點的資料。指向左節點(左子樹),指向右節點(右子樹)。當不存在左節點(左子樹)或者右節點(右子樹)時,則指向空就好。

於是我們就可以構造乙個二叉樹所需要的節點。

typedef

struct treenode

binarytreenode;

當然,根據需要乙個節點也可以儲存很多資料,比如乙個學生的姓名學號生日**等等等。

二叉樹有很多種搭建方法。在不同的場景可以有用不同的方法。雖然二叉樹是一種非線性的結構。我們依然可以使用陣列來儲存。

如果將根節點看做第零個節點的話,他的左孩子節點的下標等於父節點的下標的二倍加一,右孩子節點的下標等於父節點的下標的二倍加二。這樣比較簡單我就不貼**了。

我們還是利用在上面建的節點。利用鏈式構成二叉樹。我們確定乙個根節點。然後讓比根節點小的去左節點,比根節點大的去右節點。這樣構成的樹是一顆二叉查詢樹。當我們用中序遍歷時,遍歷結果就是公升序的。

binarytreenode*

inittree

(bttype *a,

int nums)

//建樹

else

//執行else說明這棵樹是有根節點的。

else

if(newnode->_val > cur->_val)

//向右子樹移動

}else

//說明當前節點可以是空的 可以儲存

} cur = root;

//節點儲存完畢, 需要返回root重新開始判斷下乙個節點往**儲存。}}

return root;

}

我們提到了二叉樹很形象的是遞迴的產物。 所以二叉樹的問題用遞迴的思想會很方便處理。我們假設現在有一顆只有這樣一顆只有三個節點的二叉樹。

二叉樹的遍歷又有三種順序:

而我們每遍歷乙個節點時,使用的方法都是一樣的,所以我們只需要利用遞迴的想法。例如前序遍歷: 先用前序遍歷左子樹,然後輸出根節點,在用前序遍歷右子樹。當程式進入「前序遍歷左子樹」時,依然會滿足這個邏輯。這樣就可以完成二叉樹的遞迴遍歷。

void

inorder

(binarytreenode *root)

//中序遍歷

}void

prevorder

(binarytreenode *root)

// 前序遍歷

}void

postorder

(binarytreenode* root)

// 後序遍歷

}

在解決其他樹的問題的時候也是這樣的,掌握遞迴的思想會很有效的解決一些樹的問題。但是,雖然遞迴是乙個很好地解決問題的途徑。但是遞迴會帶來一些問題。比如沒遞迴一次就需要重新開闢一片記憶體來跑函式。所以如果不能確定的控制遞迴的結束條件。遞迴就會無窮盡的下去。或者當遞迴層數很多時,**的效率會很低。也很浪費記憶體。所以一些地方甚至會要求請盡量不要遞迴。當然,遞迴依然是乙個處理問題的有效手段。

像求一顆樹的節點個數,葉子節點個數,翻轉二叉樹等等問題上,遞迴依然可以讓我們很快速的寫出**。

nt treesize

(binarytreenode *root)

//求樹大小

inttreeleafsize

(binarytreenode *root)

//葉子數

intmaxdepth

(struct treenode* root)

// 二叉樹深度

struct treenode*

inverttree

(struct treenode* root)

return root;

}

二叉樹遍歷及C語言實現

二叉樹遍歷及c 語言實現 已知中序和前序序列,或者已知中序和後序序列,都能夠構造一棵二叉樹。在本例中,本人用c 語言寫程式解答了下面兩個演算法題 1 給出一棵二叉樹的中序與後序遍歷序列,求出它的先序遍歷序列。2 給出一棵二叉樹的中序與先序遍歷序列,求出它的後序遍歷序列。知識點扼要回顧 所謂二叉樹的遍...

zz 二叉樹遍歷及C語言實現

二叉樹遍歷及c語言實現 已知中序和前序序列,或者已知中序和後序序列,都能夠構造一棵二叉樹。在本例中,本人用c語言寫程式解答了下面兩個演算法題 1 給出一棵二叉樹的中序與後序遍歷序列,求出它的先序遍歷序列。2 給出一棵二叉樹的中序與先序遍歷序列,求出它的後序遍歷序列。知識點扼要回顧 所謂二叉樹的遍歷,...

C語言實現二叉樹

1.c語言實現二叉樹中節點間最大距離 includetypedef struct treenode treenode 我們可以將所有的結點的左右子樹的高度和計算一下,然後取出最大值,就是最遠的距離。int getmaxdistance treenode root,int maxdistance in...