劍指Offer演算法題JAVA版21-30題(全是個人寫的非官方,只供參考和自己複習,測試用例都通過了。)
阿新 • • 發佈:2018-12-31
21.棧的壓入、彈出序列、
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
(思路:模擬整個過程,如果,彈出序列正確那麼棧裡最終為空的,否則,棧不為空)
22.從上往下列印二叉樹public boolean IsPopOrder(int [] pushA,int [] popA) { Stack<Integer> stack =new Stack<Integer>(); int j=0; for(int i=0;i<pushA.length;i++){ stack.push(pushA[i]); while(j<=i&&popA[j]==stack.peek()){ stack.pop(); j++; } } return stack.isEmpty()?true:false; }
從上往下打印出二叉樹的每個節點,同層節點從左至右列印。
(思路:用一個佇列儲存節點,每個被讀取的節點將自己的左右孩子放入佇列,然後出佇列,並將出佇列的元素值放入list。迴圈知道佇列為空)
public class Solution { ArrayList<Integer> list=new ArrayList<Integer>();//存放節點值的list public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root==null){ return list; } ArrayList<TreeNode> list1=new ArrayList<TreeNode>();//佇列 list1.add(root);//現將頭節點放入佇列 while(!list1.isEmpty()){ if(list1.get(0).left!=null){//放節點的左右孩子 list1.add(list1.get(0).left); } if(list1.get(0).right!=null){ list1.add(list1.get(0).right); } list.add(list1.get(0).val);//儲存當前節點的值到list list1.remove(0);//出佇列 } return list; } }
23.二叉搜尋樹的後序遍歷序列
輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。
23.1(思路:BST的後序序列的合法序列是,對於一個序列S,最後一個元素是x (也就是根),如果去掉最後一個元素的序列為T,那麼T滿足:T可以分成兩段,前一段(左子樹)小於x,後一段(右子樹)大於x,且這兩段(子樹)都是合法的後序序列。完美的遞迴定義 : ))
public class Solution { public static boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length==0){ return false; } if(sequence.length==1){ return true; } int i=0; while(sequence[i]<sequence[sequence.length-1]){ i++; } boolean isOk=false; int j=i; while(sequence[j]>sequence[sequence.length-1]){ j++; } if(j==sequence.length-1){ isOk=true; } int [] sequenceSmall=new int[i]; for(int k=0;k<i;k++){ sequenceSmall[k]=sequence[k]; } int [] sequenceBig=new int[sequence.length-1-i]; for(int t=0;t<sequenceBig.length;t++){ sequenceBig[t]=sequence[i+t]; } if(sequenceSmall.length!=0&&sequenceBig.length!=0){ return isOk&&VerifySquenceOfBST(sequenceSmall)&&VerifySquenceOfBST(sequenceBig); }else if(sequenceSmall.length==0&&sequenceBig.length==0){ return isOk; }else if(sequenceSmall.length==0&&sequenceBig.length!=0){ return isOk&&VerifySquenceOfBST(sequenceBig); }else{ return isOk&&VerifySquenceOfBST(sequenceSmall); } } }
23.2非遞迴
public class Solution {
public static boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0||sequence==null) return false;
int n=sequence.length-1;
while(n>=0){
int i=0;
while(sequence[i]<sequence[n])i++;
while(sequence[i]>sequence[n])i++;
if(i!=n) return false;
n--;
}
return true;
}
}
24.二叉搜尋樹與雙向連結串列
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
public class Solution {
static Stack<TreeNode> stack =new Stack<TreeNode>();
public static TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
TreeNode nowNode=null;
Stack<TreeNode> stack =stack1(pRootOfTree);
if(!stack.isEmpty()){
nowNode=stack.pop();
while(!stack.isEmpty()){
nowNode.left=stack.peek();
stack.peek().right=nowNode;
nowNode=stack.pop();
}
}
return nowNode;
}
public static Stack<TreeNode> stack1(TreeNode pRootOfTree){
if(pRootOfTree==null)
return null;
if(pRootOfTree.left!=null){
stack1(pRootOfTree.left);
}
stack.push(pRootOfTree);
if(pRootOfTree.right!=null){
stack1(pRootOfTree.right);
}
return stack;
}
}