LeetCode 606. 根據二叉樹建立字串
阿新 • • 發佈:2022-03-19
606. 根據二叉樹建立字串
Solution
思路:最開始的思路就是簡單的先序遍歷,然後就可以得到帶有空括號的字串,再處理即可,程式碼都寫了,然後發現有問題,還是在遍歷的時候控制比較好,然後就開始無腦亂改,發現邏輯是通的,不過程式碼已經成狗屎了,刪了重新寫,梳理邏輯,1Y
主要是葉節點和非葉節點的)
,應該是葉節點不處理, 統一回退處理,然後存在孩子之一必有(
,然後就是轉右孩子的細節)(
class Solution { StringBuilder str = new StringBuilder(); public String tree2str(TreeNode root) { if (root == null) return ""; preOrder(root); return str.toString(); } void preOrder(TreeNode p) { str.append(p.val); if (p.left == p.right && p.left == null) { //處理葉節點 不需要這裡加')'; return; } if (p.left != null || p.right != null) { //左邊不能省 所有存在孩子之一就要有'(' str.append('('); } if (p.left != null) { // 左孩子 preOrder(p.left); } if (p.right != null) { // 轉右孩子的時候 要“封好”又要“開始” str.append(')'); str.append('('); preOrder(p.right); } str.append(')'); //回退的時候加')' } }
//狗屎程式碼! class Solution { StringBuilder str = new StringBuilder(); public String tree2str(TreeNode root) { if (root == null) return ""; preOrder(root); return str.toString(); // return dealString(str.toString()); } void preOrder(TreeNode p) { // str.append(p.val); // if (p.left != null || p.right != null) { // str.append('('); // } // if (p.left != null) { // preOrder(p.left); // } // if (p.left == null && p.right != null) { // str.append(')'); // } // if (p.left != null || p.right != null) { // str.append('('); // } // if (p.right != null) { // preOrder(p.right); // } // if (p.left == null && p.right != null) { // str.append(')'); // } // str.append(')'); } // String dealString(String res) { // StringBuilder ans = new StringBuilder(); // char[] s = res.toCharArray(); // int len = res.length(); // int idx = 0; // while (idx + 1 < len) { // if (s[idx] == '(' && s[idx + 1] == ')') { // idx += 2; // } // ans.append(s[idx++]); // } // return ans.toString(); // } }