題目描述(簡單難度)
判斷兩個二叉樹是否相同。
解法一
這道題就很簡單了,只要把兩個樹同時遍歷一下,遍歷過程中判斷數值是否相等或者同時爲 null 即可。而遍歷的方法,當然可以選擇 DFS 裏的先序遍歷,中序遍歷,後序遍歷,或者 BFS。
當然實現的話,可以用遞歸,用棧,或者中序遍歷提到的 Morris。也可以參照 98 題 、 94 題 ,對二叉樹的遍歷討論了很多。
這裏的話,由於最近幾題對中序遍歷用的多,所以就直接用中序遍歷了。
public boolean isSameTree(TreeNode p, TreeNode q) {
return inorderTraversal(p,q);
}
private boolean inorderTraversal(TreeNode p, TreeNode q) {
if(p==null&&q==null){
return true;
}else if(p==null || q==null){
return false;
}
//考慮左子樹是否符合
if(!inorderTraversal(p.left,q.left)){
return false;
}
//考慮當前節點是否符合
if(p.val!=q.val){
return false;
}
//考慮右子樹是否符合
if(!inorderTraversal(p.right,q.right)){
return false;
}
return true;
}
時間複雜度:O(N)。對每個節點進行了訪問。
空間複雜度:O(h),h 是樹的高度,也就是壓棧所耗費的空間。當然 h 最小爲 log(N),最大就等於 N。
最好情況例子
1
/ \
2 3
/ \ / \
4 5 6 7
最差情況例子
1
\
2
\
3
\
4
總
這道題比較簡單,本質上考察的就是二叉樹的遍歷。
更多詳細通俗題解詳見 leetcode.wang 。