Leetcode 226
題目鏈接:翻轉(zhuǎn)二叉樹
就是遍歷每一個節(jié)點,交換每一個節(jié)點的左右節(jié)點就可以翩瓜。只需要注意不可以使用中序遍歷
public TreeNode invertTree(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
if(root != null) queue.offer(root);
while(!queue.isEmpty()){
TreeNode cur = queue.poll();
if(cur!=null) {
TreeNode temp = cur.left;
cur.left = cur.right;
cur.right = temp;
queue.offer(cur.left);
queue.offer(cur.right);
}
}
return root;
}
Leetcode 101
題目鏈接:對稱二叉樹
一些思維定式需要克服跨扮,如果遞歸之傳入一個cur節(jié)點序无,那么遞歸cur節(jié)點的左右是肯定無法做到同時在一個函數(shù)的棧中遞歸到最左葉子節(jié)點和最右葉子節(jié)點的;但是傳入兩個節(jié)點left和right衡创,分別遞歸left的left節(jié)點帝嗡,right的right節(jié)點就可以做到
初步的思路就是用數(shù)組保存中序遍歷的結(jié)果,然后檢查這個數(shù)組是不是回文璃氢,但是這種思路無法過全部的測試
例如如下樣例:
按照初步思路結(jié)果為true哟玷,但是正確答案應(yīng)該為false
正確思路還是要通過結(jié)構(gòu)來判斷
//遞歸方法
public boolean Compare(TreeNode left, TreeNode right){
if(left==null&&right==null) return true;
else if(left==null&&right!=null) return false;
else if(left!=null&&right==null) return false;
else if(left.val!=right.val) return false;
return Compare(left.left, right.right)&&Compare(left.right, right.left);
}
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
else return Compare(root.left, root.right);
}
// 非遞歸方法如下
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if(left==null&&right==null) continue;
if(left==null||right==null||left.val!=right.val) return false;
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
Leetcode 104
題目鏈接:二叉樹的最大深度
public int maxDepth(TreeNode root) {
if(root==null) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right))+1;
}
Leetcode 111
題目鏈接:二叉樹的最小深度
注意題干中的葉子節(jié)點,比最大深度需要更多的判斷條件一也!
public int minDepth(TreeNode root) {
if(root==null) return 0;
int left = minDepth(root.left);
int right = minDepth(root.right);
// 判斷是否為葉子節(jié)點
// 當(dāng)一個左子樹為空碗降,右不為空,這時并不是最低點
if (root.left == null && root.right != null) {
return 1 + right;
}
// 當(dāng)一個右子樹為空塘秦,左不為空讼渊,這時并不是最低點
if (root.left != null && root.right == null) {
return 1 + left;
}
int result = 1 + Math.min(left, right);
return result;
}