輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
最初級的解法:這道題本身就是基於offer55-i出發的,先採用層序遍歷的思想,把每一層的節點都儲存到queue佇列中,然後把每個節點的左右子樹分別傳到maxdepth()函式中,求解其左右子樹的最大深度,然後進行比較即可,若出現左右子樹深度差大於1的情況,則直接return。這個方法複雜度實在是有點高,時間複雜度最差應該是o(n^2),進而導致時間超時。
/**
* definition for a binary tree node.
* public class treenode
* }*/class solution
queuequeue = new linkedlist();
queue.add(root);
while(!queue.isempty())
if(node.right != null)
int left = maxdepth(node.left)+1;
int right = maxdepth(node.right)+1;
// system.out.println("root:"+root.val+" left:"+left+" right:"+right);
if(math.abs(left-right)>1)}}
return flag;
}public int maxdepth(treenode root)
int left = maxdepth(root.left);
int right = maxdepth(root.right);
// if(math.abs(left-right)>1)
return math.max(left+1,right+1);
}}
受到k神大佬啟發,採用剪枝思想,因為本身offer-55 i就是從下到上走的,從底至頂返回子樹深度,在每次求解maxdepth()的時候,其實在裡面加乙個判斷就行,判斷每個子樹的深度差是否超過1,如果超過1則直接return。優化後的**如下:
/**
* definition for a binary tree node.
* public class treenode
* }*/class solution
maxdepth(root);
return flag;
}public int maxdepth(treenode root)
int left = maxdepth(root.left);
int right = maxdepth(root.right);
if(math.abs(left-right)>1 || flag==false)
return math.max(left+1,right+1);
}}
複雜度分析
時間複雜度:o(n),因為需要遍歷n個節點。
空間複雜度:o(n),退化成煉表的時候,就需要遞迴到最底部,系統會開闢o(n)的佔空間。
劍指offer 55 II 平衡二叉樹
題目鏈結 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,nu...
劍指offer55 II 平衡二叉樹
題目 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。分析 平衡二叉樹 balance tree 的定義是 二叉樹中任意節點的左右子樹的深度相差不超過1。注意是任意節點,並不只是根節點的 左深度 右深度 還有其子樹也必須是平衡二叉樹。從該定義也可知是利用遞迴來解決這個問題。class soluti...
劍指 Offer 55 II 平衡二叉樹
輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹 二叉樹中任意節點的左右子樹的深度相差不超過1,則是平衡二叉樹 回顧遞迴求深度的方案,是先求得左右子樹的深度,然後進一步得到當前節點的深度,即先左右子樹,再根節點 可以直接加入乙個全域性變數記錄當前是否平衡,並額外引入乙個邏輯來比較子樹的深度 bfs迭...