目標:每日更新。還有兩個月。過一遍!!
2017-5-20 topic:樹
5.24更新
4.1 二叉樹平衡檢查
題目描述
實現一個函數,檢查二叉樹是否平衡,平衡的定義如下,對于樹中的任意一個結點,其兩顆子樹的高度差不超過1。
給定指向樹根結點的指針TreeNode* root,請返回一個bool,代表這棵樹是否平衡。
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class Balance {
public boolean isBalance(TreeNode root) {
if(root==null) return true;
// write code here
if(Math.abs(length(root.left)-length(root.right))>1)
return false;
else
return isBalance(root.left)&&isBalance(root.right);
}
public int length(TreeNode root){
if(root==null)
return 0;
else{
return Math.max(length(root.left), length(root.right))+1;
}
}
}
總結 :上述代碼 會重復計算某個節點的高度,復雜度是nlogn。
題目描述
對于一個元素各不相同且按升序排列的有序序列,請編寫一個算法,創建一棵高度最小的二叉查找樹
//根據一個有序升序的數組,創建一個最小高度的二叉搜索樹
Node createMinBST(int arr[] ,int start ,int end){
int l=start;
int r=end;
int middle=(l+r)/2;
Node node= new Node(arr[middle],null,null);
node.leftNode=createMinBST(arr, l, middle-1);
node.rightNode=createMinBST(arr, middle+1, r);
return node;
}
Node createMinBST(int arr[]){
return createMinBST(arr, 0, arr.length-1);
}
int getLength(Node root){
if(root==null) return 0;
return Math.max(getLength(root.leftNode), root.rightNode)+1;
}
備注 :如果求高度的話,可以先構建 ,再求高度,不過這樣子會運算兩次。
題目描述
對于一棵二叉樹,請設計一個算法,創建含有某一深度上所有結點的鏈表。
給定二叉樹的根結點指針TreeNode* root,以及鏈表上結點的深度,請返回一個鏈表ListNode,代表該深度上所有結點的值,請按樹上從左往右的順序鏈接,保證深度不超過樹的高度,樹上結點的值為非負整數且不超過100000。
第一印象,想到了層次遍歷。又想到了s型打印。在層次遍歷(因為要打印一層,用兩個queue)的基礎上記錄下,每次到第幾層了。最后打印一下。創建一個鏈表。
//打印某一深度上的所有節點。
void getNodeByDep(Node root,int dep){
LinkedList<Node> list1= new LinkedList<>();
LinkedList<Node> list2= new LinkedList<>();
if (root==null) return;
int tmp=1;
list1.add(root);
while(tmp<=dep-1 &&!list1.isEmpty()){
while(!list1.isEmpty()){
Node node=list1.poll();
if(node.leftNode!=null){
list2.add(node.leftNode);
}
if(node.rightNode!=null){
list2.add(node.rightNode);
}
}
LinkedList<Node> tp=list1;
list1=list2;
list2=tp;
tmp++;
}
if(tmp==dep)
for(Node node:list1)
System.out.print(node.value+" ");
else
System.out.print("none");
}