二叉樹高度、寬度計算
阿新 • • 發佈:2019-01-08
二叉樹高度可以採用遞迴計算
public class TreeNode{
Data value;
TreeNode left;
TreeNode right;
TreeNode(Data data,TreeNode left,TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
}
public int getDeep(TreeNode root) {
if (root == null) {
return 0;
} else {
int left = getDeep(root.left);
int right = getDeep(root.right);
return Math.max(left,right) + 1;
}
}
二叉樹寬度可以採用計算迭代和遞迴,優先看看迭代計算:
// 從根節點,一層一層的計算寬度,保留最大寬度
public int getWeight(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new ArrayDeque<>();
int maxWeight = 1;
queue.add(root);
// 一層一層迭代
while(true) {
int len = queue.size();
if(len == 0) {
break;
}
// 每一層遍歷所有節點
while( len >0 ){
// 獲取並刪除佇列中的頭部節點
TreeNode t = queue.poll();
len--;
// 新增下一層的子節點到佇列
if(t.left != null){
queue.add(t.left);
}
if(t.right != null){
queue.add(t.right) ;
}
maxWeight = Math.max(maxWeight,queue.size());
}
}
return maxWeight;
}
再來看看遞迴演算法:
public int getWeight(TreeNode root) {
if(root == null){
return 0;
}
int maxWeight = 0;
if(root.left == null && root.right == null) {
return 1;
} else {
// 遞迴到葉子節點層,計算其寬度,然後迭代到根節點
maxWeight = Math.max(getWeight(root.left)+getWeight(root.right),maxWeight);
}
return maxWeight;
}