二叉樹和遞迴有著妙不可言的聯絡,這篇文章會有著不斷的遞迴,遞迴往往**簡單,但是十分難想
首先給出二叉樹的結構
//二叉樹的資料結構
typedef
char elem;
typedef
struct bnode bnode;
以前序遍歷的方式建立二叉樹
如果字元不為『#』,建立結點,並給資料,然後建立左子樹,在建立右子樹這裡應該注意int一定要傳入指標,如果不傳入指標,遞迴壓棧的時候,壓入的int還是原來的int,並不會連續改變p的值
bnode*
createbinarytree
(char
* src,
int* p)
else
}
前後中序的非遞迴遍歷
以前序遍歷為例:如果該節點不為空,列印該根節點,再遍歷左子樹,再遍歷右子樹
//前序遍歷
void
binarytreeprevorder
(bnode* root)
else
}//中序遍歷
void
binarytreeinorder
(bnode* root)
else
}//後序遍歷
二叉樹的銷毀函式
這裡值得一說的是二級指標的必要性,雖然一級指標可以起到銷毀的作用,但是並沒有更改root的指向,通過二級指標直接修改外部指標的內容
如下圖:
void
deletebinarytree
(bnode*
* root)
}
二叉樹結點個數
int
binarytreesize
(bnode* root)
二叉樹葉子結點個數
int
binarytreeleafsize
(bnode* root)
return
binarytreeleafsize
(root->_left)
+binarytreeleafsize
(root->_right)
;}
第k層結點個數
int
binarytreelevelksize
(bnode* root,
int k)
查詢結點
bnode*
binarytreefind
(bnode* root, elem x)
判斷兩棵樹是否相同
int
issametree
(bnode* p, bnode* q)
判斷乙個樹是否為另乙個樹的子樹
int
issubtree
(bnode* s, bnode* t)
二叉樹的深度
int
maxdepth
(bnode* root)
判斷是否為一棵平衡二叉樹
bool _isbalanced
(treenode* root,
int* curdepth)
int leftdepth =
0, rightdepth =0;
if(_isbalanced
(root->left,
&leftdepth)
&&_isbalanced
(root->right,
&rightdepth)
&&abs
(leftdepth - rightdepth)
<2)
else
return false;
}
bool isbalanced
(treenode* root)
判斷是否為對稱二叉樹
bool _issymmetric
(treenode* left, treenode* right)
bool issymmetric
(treenode* root)
線索二叉樹(C語言描述)
線索二叉樹的定義 還是按照鏈二叉樹的方法建立,只不過在結點原本為空的左指標改為指向該結點在中序遍歷中的前驅,結點原本為空的右指標改為指向該結點在中序遍歷中的後繼,也就是說把空的指標給利用了起來。1.定義結構體 與鏈二叉樹不同的是結點增加了兩個資料,判斷指標下乙個連線的是樹還是線索 typedef e...
二叉樹的相關操作(c語言)
二叉樹的相關操作 包括先序序列 中序序列建樹丶後序序列 中序序列建樹丶層次序列 中序序列建樹 先序遍歷丶中序遍歷丶後序遍歷丶層次遍歷 二叉樹的深度及最大寬度 度分別為0,1,2的節點個數以及總結點個數 include include include include 二叉樹節點結構體 struct b...
二叉樹相關
1.首先建立乙個樹節點,節點有值,左節點和右節點 author 張夢楠 title package description date 2018 5 2519 27 blog www.itzmn.com 樹的節點類 public class treenode public treenode int v...