對於二叉樹的深度的求解,利用遞迴的方式求解很簡單:
下面就來設計這個遞迴演算法:
要求乙個節點的高度,先求左子樹的高度,然後再求解右子樹的高度。演算法**實現:最後樹的高度就是1+max(left_depth, right_depth)。
int leftlen = depth_tree(root->left);
int rightlen = depth_tree(root->right);
return 1 + max(leftlen, rightlen);
那麼這個遞迴的出口是什麼:
(1)可以遞迴到1,如果乙個節點不為null,但是這個節點的左子樹為null,
並且右子樹也為null,那麼返回高度為1。
但是有這種情況:這個節點的左子樹不為null,右子樹為null,上面求leftlen和rightlen的遞迴還是會傳入null。
所以這種遞迴的出口不可行。
(2)索性讓遞迴的出口變成傳入null引數,也就是說為null單獨遞迴一次函式。
if(root == null)
return 0;
就這乙個出口就能解決所有的。
int depth_tree(treenode *root)先看二叉樹的最低高度的定義:從根節點都任乙個葉子節點中路徑最短的那個就是二叉樹的最低高度。int nleft = depth_tree(root->left);
int nright = depth_tree(root->right);
return 1 + (nleft > nright ? nleft : nright);
}
那麼這樣一看,似乎可以這個設計,把最後一句話改為: return
1 + min(left, right); 但是這樣是不可行的。舉乙個簡單的例子:
上面的**返回的結果是1,但是這棵樹的最低高度是3,因為要從根到乙個葉子節點的長度。所以要修改最後的返回結果,在left和right中,如果有乙個為0,則返回另乙個的值;當兩個都不是0的時候,才返回二者中較小的那個。
所以**實現:
int mindepth(treenode* root)還是用遞迴的想法,想判定根節點是不是平衡的,如果不是就直接返回false,如果是然後就分別去判斷這個根的左子樹和右子樹是否都是平衡的二叉樹。int left = mindepth(root->left);
int right = mindepth(root->right);
if(!left)
else if(!right)
else
}
**實現:
bool isbalance(treenode *root)但是現在演算法的效率還是不夠高,求解root的平衡性的時候,我們遍歷了左子樹和右子樹求解子樹的高度。當我們求解root孩子的平衡性的時候,還要求解root孩子左右子樹的高度,有很大一部分節點重複的被遍歷了。所以效率大大的降低了。return isbalance(root->left) && isbalance(root->right);
}
前面的演算法是,對於每乙個節點都要去求解它的左右子樹的高度,那麼可以利用二叉樹的後序遍歷方式,當遍歷到某個節點的時候,它的左子樹和右子樹都已經遍歷完成,同時要分別帶回左、右子樹的高度,以便左右子樹高度對比。
bool isbalance(treenode *root, int *depth)這裡只是乙個後序遍歷帶回高度的演算法,每個節點僅僅的遍歷了一次。int left, right;
if(isbalance(root->left, &left) && isbalance(root->right, &right)) }
return false;
}
二叉樹的深度,平衡二叉樹,二叉樹的映象
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。實現,遞迴遍歷二叉樹的左子樹,右子樹,取子樹深度大值,再加上子樹與根節點的距離1,即為這顆二叉樹的深度 classsolution 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。平...
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...
劍指55 二叉樹的深度 平衡二叉樹判定
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。思路 每個根節點的深度都是左右子樹最大值加1 struct treenode class solution 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。思路 通過後序遍歷可獲得左...