首先二叉樹是樹形結構的一種特殊型別,它符合樹形結構的所有特點。本篇部落格會針對二叉樹來介紹一些樹的基本概念,二叉樹的基本操作(儲存,返回樹的深度,節點個數,每一層的節點個數),二叉樹的四種遍歷(層次,先序,中序,後序)
一.基本概念
二叉樹有5種基本形態:
注:二叉樹有序樹,就是說乙個節點的左右節點是有大小之分的,我們通常設定為左孩子一定大於右孩子,下面的實現都是基於這個規則的。
二叉樹分為三種:滿二叉樹,完全二叉樹,不完全二叉樹
二叉樹的四種遍歷:層次,先序,中序,後序
首先是非遞迴實現上圖的滿二叉樹:
1.先序:根左右,用棧來實現,下面是它的流程圖和入棧出棧的狀態圖(n是每個節點的值) 輸出:12,10,9,11,15,14,16
2.中序:左根右,用棧來實現,中序的堆疊狀態和先序一樣,只是輸出的位置不同,先序在入棧前輸出,中序在出棧後輸出 輸出:9,10,11,12,14,15,16
3.後序:左右根,採用了兩個棧 輸出:9,11,10,14,16,15,12
下面是實現的**:
//建立乙個節點類
class node
//得到資料
public
intgetkey()
}public
class binarytree
else
//葉子節點的if end;
}//左子樹的if end;
else//葉子
}//右子樹}}
}//insert end;
//列印
public
void
printltree(node node)
//深度
public
intheight(node node)
else
}//節點個數
public
intnodenum(node node)
return nodenum(node.leftnode)+nodenum(node.rightnode)+1;
}//第k層節點的個數
public
intgetleafnodenum(node node,int i)
else
else}}
//分層遍歷
public
void
levelorder(node node)
queue.add(node);
while(!queue.isempty())
if(temp.rightnode!=null)}}
//遞迴前序遍歷
public
void
preorder(node node)
}//非遞迴前序遍歷
public
void
npreorder(node node)
else}}
//中序遍歷
public
void
inorder(node node)
}//非遞迴的中序遍歷
public
void
ninorder(node node)
else}}
//後序遍歷
public
void
postorder(node node)
}//非遞迴後序遍歷
public
void
npostorder(node node)
else
}while(!s2.isempty())
}public
static
void
main(string args)
}
**親測可以執行(^-^)v
這些只是二叉樹的一部分內容,希望可以幫助一些初學資料結構的親,如果有錯誤的地方可以幫忙提出來的哦!!
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹的遞迴 非遞迴遍歷
二叉樹的遍歷 2011.8.25 出處 二叉樹的非遞迴遍歷 二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序 中序以及後序三種遍歷方法。因為樹的定義本身就是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且 很簡潔。而對於樹的遍歷若採用非...
二叉樹的遞迴非遞迴遍歷
二叉樹的遍歷一直是常考題,遍歷可以使用遞迴方法也可以使用非遞迴方法。首先先看下遞迴方法。public class node 後序遍歷 public void posorder node head 下面看下非遞迴實現 非遞迴方式實現二叉樹的前序遍歷。借助棧來實現。1,申請乙個棧,記為s,將頭結點hea...