滿二叉樹是一類二叉樹,其中每一個結點剛好有 0 或 2 個子結點。node
返回包含 N
個結點的全部可能滿二叉樹的列表。 答案的每一個元素都是一個可能樹的根結點。ui
答案中每一個樹的每一個結點
都必須有 node.val=0
。this
你能夠按任何順序返回樹的最終列表。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
提示:
每一個結點都有一個從 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; }