leetcode樹專題894.897,919,951

 

滿二叉樹是一類二叉樹,其中每一個結點剛好有 0 或 2 個子結點。node

返回包含 N 個結點的全部可能滿二叉樹的列表。 答案的每一個元素都是一個可能樹的根結點。ui

答案中每一個樹的每一個結點都必須有 node.val=0this

你能夠按任何順序返回樹的最終列表。spa

 

示例:code

輸入:7
輸出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]
解釋:

 

提示:blog

  • 1 <= N <= 20

遞歸作的,遞歸

貼代碼:ip

public List<TreeNode> allPossibleFBT(int N) {
        List<TreeNode>list=new ArrayList<TreeNode>();
         TreeNode node=new TreeNode(0);
        if(N==0)
            return null;
        if(N==1){
            list.add(node); 
            return list;
        }
       
        else{
            List<TreeNode>list1=new ArrayList<TreeNode>();
            for(int h=1;h<N-1;h++){
             if(h%2==0)
                continue;
             List<TreeNode>left=allPossibleFBT(h);
             List<TreeNode>right=allPossibleFBT(N-h-1);
            if(h==3){
                    //System.out.println(right.size());
                    //System.out.println(right.get(0).left.val);
                     //System.out.println(right.get(0).right.right.val);
                    //System.out.println(right.get(1).left.left.val);
                     //System.out.println(right.get(1).right.val);
               }
             for(int j=0;j<left.size();j++){
                
                
                for(int i=0;i<right.size();i++){
                      TreeNode node1=new TreeNode(0);
                     node1.left=left.get(j);
                    node1.right=right.get(i);
                    list1.add(node1);
                }
            }
        }
            return list1;
            
    }
       
            
        
    }

艾瑪這題有點坑,剛開始我把TreeNode初始化放在第一層循環裏面,結果解答錯誤,放在第二層循環就對了,求好心人告知這是什麼緣由,像下面這樣。我是怎麼發現這個的呢。我是實在找不到bug了,讓一個大佬看看,而後他以爲放在裏面好看因而挪進去,因而就經過了,我去,驚了。leetcode

 

897遞增順序查找樹get

給定一個樹,按中序遍歷從新排列樹,使樹中最左邊的結點如今是樹的根,而且每一個結點沒有左子結點,只有一個右子結點。

 

示例 :

輸入:[5,3,6,2,4,null,8,1,null,null,null,7,9]

       5
      / \
    3    6
   / \    \
  2   4    8
 /        / \ 
1        7   9

輸出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]

 1
  \
   2
    \
     3
      \
       4
        \
         5
          \
           6
            \
             7
              \
               8
                \
                 9  

 

提示:

  1. 給定樹中的結點數介於 1 和 100 之間。
  2. 每一個結點都有一個從 0 到 1000 範圍內的惟一整數值。

樹的題目作多了,發現遍歷很重要,前序、中序、後序和層次遍歷都應該掌握

  public TreeNode increasingBST(TreeNode root) {
        Stack <TreeNode>stack=new Stack<TreeNode>();
        List<Integer>re=new ArrayList<Integer>();
        int tag=0;
       
        while(root!=null||!stack.isEmpty()){
            while(root!=null){
                stack.push(root);
                root=root.left;
            }
            if(!stack.isEmpty()){
                TreeNode node=stack.pop();
               re.add(node.val);
                root=node.right;
            }
        }
        TreeNode next=new TreeNode(re.get(re.size()-1));
        for(int i=re.size()-2;i>=0;i--){
           TreeNode node=new TreeNode(re.get(i));
            node.right=next;
            next=node;
        }
        return next;
    }

 

919. 徹底二叉樹插入器

這題仍是層次遍歷的變形,固然個人這種作法並很差,用了243Ms,感受快要超時了

class CBTInserter {
   TreeNode root;
    public CBTInserter(TreeNode root) {
       this.root=root;
    }
    
    public int insert(int v) {
       Queue <TreeNode>queue=new LinkedList<TreeNode>();
        queue.offer(root);
        int re=0;
        int flag=0;
        while(!queue.isEmpty()){
            for(int i=0;i<queue.size();i++){
                TreeNode node=queue.poll();
                if(node.left==null&&node.right==null){
                    node.left=new TreeNode(v);
                    re=node.val;
                    flag=1;
                }
                else if(node.right==null){
                    node.right=new TreeNode(v);
                    re=node.val;
                    flag=1;
                }
                else{
                    queue.offer(node.left);
                    queue.offer(node.right);
                }
               if(flag==1)
                    break;
                
            }
             if(flag==1)
                    break;
        }
        return re;
        
    }
    
    public TreeNode get_root() {
        
     return root;
    }
}

951. 

翻轉等價二叉樹

簡單的遞歸,嘿嘿

 public boolean flipEquiv(TreeNode root1, TreeNode root2) {
        if(root1==null&&root2==null)
            return true;
        else if(root1==null||root2==null)
            return false;
        if(root1.val!=root2.val)
            return false;
        if(root1.left==null&&root1.right==null&&root2.left==null&&root2.right==null)
            return true;
        boolean judge1=flipEquiv(root1.left,root2.left)&&flipEquiv(root2.right,root1.right);
        boolean judge2=flipEquiv(root1.left,root2.right)&&flipEquiv(root1.right,root2.left);
        return judge1||judge2;
        
    }
相關文章
相關標籤/搜索