劍指 Offer 55 II 平衡二叉樹

2021-10-20 18:51:19 字數 1561 閱讀 4725

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過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迭...