求二叉树中结点个数代码java_求二叉树中第K层结点的个数
一,問題描述
構建一棵二叉樹(不一定是二叉查找樹),求出該二叉樹中第K層中的結點個數(根結點為第0層)
二,二叉樹的構建
定義一個BinaryTree類來表示二叉樹,二叉樹BinaryTree 又是由各個結點組成的,因此需要定義一個結點類BinaryNode,BinaryNode作為BinaryTree的內部類。
此外,在BinaryTree中需要一定一個BinaryNode屬性來表示樹的根結點。
public class BinaryTree> {
private static class BinaryNode{
T element;
BinaryNode left;
BinaryNode right;
public BinaryNode(T element) {
this.element = element;
left = right = null;
}
public BinaryNode(T element, BinaryNode left, BinaryNode right){
this.element = element;
this.left = left;
this.right = right;
}
}
private BinaryNode root;
//other code.....
第一行是二叉樹類的定義,第三行是結點類的定義,第20行是二叉樹根的定義。
三,求解第K層結點個數的算法實現
求第K層結點的個數也可以用遞歸來實現:
①若二叉樹為空或者K小于0,返回0
②若K等于0,第0層就是樹根,根只有一個,返回1
③若K大于0,返回左子樹中第K-1層結點個數 加上 右子樹中第K-1層結點的個數
因為,第K層結點,相對于根的左子樹 和 右子樹 而言,就是第K-1層結點
其實,這是有改進的地方:對于K<0的情形,準確地說:它只是一個非法輸入,而不是遞歸的結束條件(基準條件)??梢钥闯?#xff0c;①不要把非法輸入與遞歸的基準條件混淆,②把非法輸入的判斷放到遞歸中判斷的開銷是很大的。因為每進行一次遞歸就需要進行一次非法輸入判斷。而如果在開始就把非法輸入過濾掉,在遞歸過程中就不會存在每一次遞歸就判斷一次非法輸入了。
遞歸的基準條件只有兩個:
1) k==0 當遞歸到K==0時,說明:第K層是有結點的
2) root==null 當遞歸到root==null時,說明:第K層沒有結點
因此,可以進一步將代碼改進如下:這樣,不需要在每次遞歸的過程中還可能附加一次 k<0 的判斷
/**
*
* @param k
* @return 二叉樹中第K層結點的個數(根位于第0層)
*/
public int k_nodes(int k){
if(k < 0)
return 0;
return k_nodes(root, k);
}
private int k_nodes(BinaryNode root, int k){
if(root == null)
return 0;
if(k == 0)
return 1;//根結點
else
return k_nodes(root.left, k-1) + k_nodes(root.right, k-1);
}
可參考:按層打印二叉樹–每行打印一層 來測試每一層是否有正確的結點個數。
四,代碼實現
public class BinaryTree> {
private static class BinaryNode{
T element;
BinaryNode left;
BinaryNode right;
public BinaryNode(T element) {
this.element = element;
left = right = null;
}
}
private BinaryNode root;
/**
* 向二叉樹中插入一個元素
* @param element
*/
public void insert(T element){
root = insert(root, element);
}
private BinaryNode insert(BinaryNode root, T element){
if(root == null)
return new BinaryNode(element);
int r = (int)(2*Math.random());
//隨機地將元素插入到左子樹 或者 右子樹中
if(r==0)
root.left = insert(root.left, element);
else
root.right = insert(root.right, element);
return root;
}
/**
*
* @param k
* @return 二叉樹中第K層結點的個數(根位于第0層)
*/
public int k_nodes(int k){
return k_nodes(root, k);
}
private int k_nodes(BinaryNode root, int k){
if(root == null || k < 0)
return 0;
if(k == 0)
return 1;//根結點
else
return k_nodes(root.left, k-1) + k_nodes(root.right, k-1);
}
public static void main(String[] args) {
BinaryTree tree = new BinaryTree<>();
int[] ele = C2_2_8.algorithm1(4);//構造一個隨機數組,數組元素的范圍為[1,4]
for (int i = 0; i < ele.length; i++) {
tree.insert(ele[i]);
}
int k_nodes = tree.k_nodes(2);//第二層
int k_nodes2 = tree.k_nodes(-1);//第-1層
int k_nodes3 = tree.k_nodes(0);
int k_nodes4 = tree.k_nodes(1);
int k_nodes5 = tree.k_nodes(4);//若超過了樹的高度,結果為0
System.out.println(k_nodes);
System.out.println(k_nodes2);
System.out.println(k_nodes3);
System.out.println(k_nodes4);
System.out.println(k_nodes5);
}
}
五,參考資料
http://blog.csdn.net/luckyxiaoqiang/article/details/7518888
https://www.cnblogs.com/hapjin/category/680818.html
總結
以上是生活随笔為你收集整理的求二叉树中结点个数代码java_求二叉树中第K层结点的个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端详细设计文档怎么写_UI设计师简历应
- 下一篇: java integer常量池_为什么I