(一)棧中最小值 ,對稱二叉樹

1.題目描述:定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。
注意:保證測試中不會當棧爲空的時候,對棧調用pop()或者min()或者top()方法。
分析:首先棧的push()和pop()都是O(1);時間複雜度爲O(1)也就是說無論數據規模多大,都可以在一次計算後找到目標(不考慮衝突的話)。棧的特色是先進後出。
思路:可以考慮用空間來換取時間

 import java.util.Stack;

public class test
{
    private static Stack<Integer> stack = new Stack<Integer>();
    private static Stack<Integer> minStack = new Stack<Integer>();
    //入棧的話有值就入棧,棧空時都入  棧不空對min棧進行判斷保證棧頂元素一定是最小的
    public void push(int node){
        stack.push(node);
        if(minStack.isEmpty()){
             minStack.push(node);
        }
        else{
            if (node<minStack.peek()){
                minStack.push(node);
            }else{
                minStack.push(minStack.peek());
            }
        }
    }
    public void pop(){

        minStack.pop();
        stack.pop();
        
    }
    //stack的棧頂元素
    public int top(){
        return stack.peek();
    }
    //minstack的棧頂元素
    public int min(){
        return minStack.peek();
    }
}

2.判斷二叉樹是否爲對稱的二叉樹
思路1:利用遞歸首先 要知道對稱的二叉樹是 節點的左孩子等於對稱節點的右孩子

boolean isDuichen(TreeNode leftRoot,TreeNode rightNode){
   if(leftRoot == null&&rightRoot ==null)
      return  trueif(leftRoot ==null || rightRoot == nullreturn false;
   if(leftRoot.val==rightRoot.val){
      return (isDuichen(leftRoot.left,rightRoot.right )&&isDuichen(leftRoot.right,rightRoot.left))
  }else{
    return false;
 }
}
boolean  isSymmetrical(TreeNode pRoot){
    if(pRoot==null){
        return true;
   }else
   return isDuichen(pRoot.left,pRoot.right);
   
}

思路2:利用鏈表就是每次添加進去然後取出來進行比較 左子樹是從左往右加,右子樹是從優往左加 就是每加入一波取出判斷一波

 boolean isSymmtrical(TreeNode pRoot){
    if(pRoot == null)
      return true;
    LinkedList<TreeNode> leftlist = new LinkedList<>();
    LinkedList<TreeNode> rightlist = new LinkedList<>();

    leftlist.add(pRoot.left);
    rightlist.add(pRoot.right);
    while(!leftlist.isEmpty()&&!rightlist.isEmpty()){
       TreeNode leftnode = leftlist.poll();
       TreeNode rightnode = rightlist.poll();
       //遍歷完列表表示檢查完畢
       if(leftnode ==null&& rightnode==null)
          return continue;
       if(leftnode =null||rightnode)=null)
          return false;
       //用不等號因爲如果用等號的話會有可能沒有遍歷完畢
       if(leftnode.val != rightnode.val)
          return false;
       //左子樹  從左往右加
       leftlist.add(leftnode.left);
       leftlist.add(leftnode.right);
       //右子樹  從右往左加   
       rightlist.add(rightnode.right);
       rightlist.add(rightnode.left);
      
    }
    return leftlist.isEmpty() && rightlist.isEmpty();
    

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章