前面我們知道了二叉樹的相關概念和性質,也了解了二叉樹的相關遍歷方法,接下來我們來實現一下其他的有關二叉樹的相關基本操作。二叉樹及其基本操作(一)(c語言遞迴實現前中後層序遍歷)
節點:包括乙個資料元素和若干指向其他子樹的分支(指標(索引))。//求二叉樹節點個數
int treesize1(treenode *root)
//方法1:遞迴
if(root->lchild ==
null
&& root->rchild ==
null)
//此時樹的節點不只有根節點
//所以節點個數就等於根節點的個數1加上左子樹的節點個數
//再加上右子樹的節點個數
return
1+ treesize(root->lchild) + treesize(root->rchild);
}//求樹的節點個數方法2的輔助函式
void _treesize2(treenode* root,int* size)
if(root ==
null
||*size <
1)
++(*size);
_treesize(root->lchild,size);
_treesize(root->rchild,size);
}int treesize2(treenode *root)
//方法2:前序遍歷,此時的訪問相當於計數+1
int size =
0; size++;
_treesize(root->lchild,&size);
_treesize(root->rchild,&size);
return size;
}
葉子節點:度為0的節點叫做葉子節點,也叫作終端節點。
節點的度:節點所擁有的子樹的個數叫做節點的度。
樹的深度:樹中所有節點的層次的最大值稱為樹的深度,也叫做樹的高度。//求葉子節點個數
int treeleafsize(treenode *root)
if(root->lchild ==
null
&& root->rchild ==
null)
//此時不只有乙個根節點
//葉子節點的個數等於根節點的左子樹的葉子節點的個數
//再加上右子樹的葉子節點的個數
return treeleafsize(root->lchild) + treeleafsize(root->rchild);
}//求二叉樹的第k層節點的個數
//此時我們可以轉換為求根節點的左右子樹的k-1層的節點個數
//遞迴呼叫函式即可得出結論
int treeklevelsize(treenode *root,int k)
if(k ==
1)
return treeklevelsize(root->lchild,k-
1) + treeklevelsize(root->rchild,k-
1);}
以下為上面所有函式的測試函式://求樹的高度
int treeheight(treenode *root)
if(root->lchild ==
null
&& root->rchild ==
null)
//呼叫函式本身,遞迴的求出根節點的左右子樹的高度
int lresult = treeheight(root->lchild);
int rresult = treeheight(root->rchild);
//取較大值返回,即為樹的高度
return
1+(lresult > rresult ? lresult : rresult);
}//查詢乙個值,返回其指標
treenode *treefind(treenode *root,treedatatype to_find)
//以前序遍歷的順序查詢
//先判斷根節點的值是否為我們要查詢的值
if(root->
data
== to_find)
//再遞迴的以根節點的左右子樹遞迴的呼叫該函式
treenode *lresult = treefind(root->lchild,to_find);
treenode *rresult = treefind(root->rchild,to_find);
//判斷哪乙個符合要求,如果lresult不是我們要找的就直接返回rresult,
//即便rresult也為空不是我們要找的值,也直接返回。
//此時返回的就是乙個空指標,說明沒有找到我們要找的值
return lresult !=
null
? lresult : rresult;
}//求乙個節點的父節點
treenode *
parent(treenode *root,treenode *child)
//判斷根節點是否為其父節點
if(root->lchild == child || root->rchild == child)
//遞迴的以根節點的左右子樹呼叫該函式
treenode *lresult =
parent(root->lchild,child);
treenode *rresult =
parent(root->rchild,child);
//判斷哪乙個符合要求,如果lresult不是我們要找的就直接返回rresult,
//即便rresult也為空不是我們要找的值,也直接返回。
//此時返回的就是乙個空指標,說明沒有找到我們要找的值
return lresult !=
null
? lresult : rresult;
}//求乙個節點的左孩子
treenode *lchild(treenode *node)
return node->lchild;
}//求乙個節點的右孩子
treenode *rchild(treenode *node)
return node->rchild;
}
測試結果如下圖:void testnodenumandheight()
//查詢乙個值,返回其指標的函式測試
void testfind()
void testparentandlrchild()
二叉樹及其基本操作
名稱 二叉樹及其基本操作 說明 最近重新學習了二叉樹,多了乙個緯度,我去難度可不是上公升乙個層次。磨磨蹭蹭慢慢悠悠的把基本操作敲完了。在此記錄一下。二叉樹的儲存結構 typedef struct bitnode bitnode,bitree 初始化 void inittree bitree t,in...
二叉樹基礎及其基本操作
2 二叉樹 樹是一種非線性結構。樹上的任意節點,就只有乙個父節點,可以有多個子節點。節點的度 乙個節點含有的子樹的個數稱為該節點的度 樹的度 一棵樹中,最大的節點的度稱為樹的度 葉子節點或終端節點 度為0的節點稱為葉子節點 雙親節點或父節點 若乙個節點含有子節點,則這個節點稱為其子節點的父節點 孩子...
二叉樹的建立及其基本操作
實驗內容 1 按照前序次序建立一棵二叉樹 2 用前 中 後序遞迴遍歷的方法遍歷二叉樹 3 求二叉樹的深度 4 求二叉樹的所有結點數 實驗基本要求 掌握二叉樹的鏈式儲存結構的建立方法和對二叉樹的各種操作演算法 include include define maxsize 100 typedef cha...