題目:輸入一棵二叉樹的根節點,判斷該樹是不是平衡的二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,調用函數TreeDepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差不超過1,按照定義它就是一棵平衡的二叉樹。這種思路實現的代碼如下:
- public boolean isBalanced(BinaryTreeNode root){
- if(root ==null)
- return true;
- int left = treeDepth(root.leftNode);
- int right = treeDepth(root.rightNode);
- int diff = left - right;
- if(diff > 1 || diff <-1)
- return false;
- return isBalanced(root.leftNode) && isBalanced(root.rightNode);
- }
每個結點只遍歷一次的解法,正是面試官喜歡的算法
如果我們用後序遍歷的方式遍歷二叉樹的每個結點,在遍歷一個結點之前我們就已經遍歷了它的左右子樹。只要在遍歷每個結點的時候我們記錄它的深度(某一節點的深度等於它到葉結點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡二叉樹。下面是這種思路的實現代碼:
- public boolean isBalanced2(BinaryTreeNode root){
- int depth = 0;
- return isBalanced2(root,depth);
- }
- public boolean isBalanced2(BinaryTreeNode root,int depth){
- if(root == null){
- depth = 0;
- return true;
- }
- int left = 0,right = 0;
- if(isBalanced2(root.leftNode,left) && isBalanced2(root.rightNode,right)){
- int diff = left-right;
- if(diff <= 1 && diff >= -1){
- depth = 1+(left > right?left : right);
- return true;
- }
- }
- return false;
- }