寫好遞歸函數,二叉樹的簡單問題就基本解決了,以下整理了二叉樹的一些簡單題目,難度遞增。
數據結構:
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
1.相同的樹
題目描述:
給定兩個二叉樹,編寫一個函數來檢驗它們是否相同。
如果兩個樹在結構上相同,並且節點具有相同的值,則認爲它們是相同的。
代碼:遞歸比較左右節點
var isSameTree = function(p, q) {
if(p===null&&q===null) return true
else if(p!=null&&q!==null&&p.val===q.val){
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right)
}
else{
return false
}
};
2.對稱二叉樹
題目描述:給定一個二叉樹,檢查它是否是鏡像對稱的。
代碼:在第一題的基礎上,這道題就不是什麼大問題了,只要遞歸檢查節點的左子樹和右子數是否是一樣的樹就可以了,上一題是分別遞歸比較兩棵樹的左子樹和右子樹,這一題則需要比較同一棵樹的左右子樹
var isSymmetric = function(root){
const isSame=(p,q)=>{
if(p===null&&q===null) return true
else if(p!==null&&q!==null&&p.val===q.val){
return isSame(p.left,q.right)&&isSame(p.right,q.left)
}else{
return false
}
}
if(root===null) return true
return isSame(root.left,root.right)
};
3.二叉樹的最大深度
題目描述:
給定一個二叉樹,找出其最大深度。
二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。
說明: 葉子節點是指沒有子節點的節點。
代碼:也是遞歸,分別遞增比較左右子樹深度
var maxDepth = function(root) {
function findMax(root,deep){
return Math.max(findMax(root.left,deep+1),findMax(root.right,deep+1))
}
return findMax(root,0)
};
題目描述:
將一個按照升序排列的有序數組,轉換爲一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
代碼:
var sortedArrayToBST = function(nums,l=0,r=nums.length) {
if(l>=r){return null}
let mid=Math.floor((l+r)/2)
let tree=new TreeNode(nums[mid])
tree.left=sortedArrayToBST(nums,left,mid)
tree.right=sortedArrayToBST(nums,mid+1,right)
return tree
};