leetcode算法【1028】從先序遍歷還原二叉樹

所有題目源代碼:Git地址

題目

我們從二叉樹的根節點 root 開始進行深度優先搜索。

在遍歷中的每個節點處,我們輸出 D 條短劃線(其中 D 是該節點的深度),然後輸出該節點的值。(如果節點的深度爲 D,則其直接子節點的深度爲 D + 1。根節點的深度爲 0)。

如果節點只有一個子節點,那麼保證該子節點爲左子節點。

給出遍歷輸出 S,還原樹並返回其根節點 root。

示例 1:在這裏插入圖片描述

輸入:"1-2--3--4-5--6--7"
輸出:[1,2,5,3,4,6,7]

示例 2:
在這裏插入圖片描述`

輸入:"1-2--3---4-5--6---7"
輸出:[1,2,5,3,null,6,null,4,null,7]

示例 3:
在這裏插入圖片描述

輸入:"1-401--349---90--88"
輸出:[1,401,null,349,88,90]
提示:

原始樹中的節點數介於 11000 之間。
每個節點的值介於 110 ^ 9 之間。

方案:樹的前序遍歷的模擬

  • 模擬樹的先序遍歷即可,代碼非最簡,仍然可簡化,但是效率還是比較高的,用時2ms,超過100%
class Solution {
        String str;
        int strIndex = 0;
        int depth = 0;
        TreeNode root;

        public TreeNode recoverFromPreorder(String S) {

            str = S;
            int val=0;
            while (strIndex<str.length()&&str.charAt(strIndex) != '-') {
                val = val*10+str.charAt(strIndex)-'0';
                strIndex++;
            }
            root = new TreeNode(val);
            root.left = new TreeNode(-1);
            if (!buildTree(1, root.left)) root.left = null;
            root.right = new TreeNode(-1);
            if (!buildTree(1, root.right))root.right=null;
            return root;
        }

        public boolean buildTree(int dep, TreeNode node) {

            while (strIndex<str.length()&&str.charAt(strIndex) == '-') {
                depth++;
                strIndex++;
            }
            if (depth == dep) {
                int val = 0;
                while (strIndex<str.length()&&str.charAt(strIndex) != '-') {
                    val = val*10+str.charAt(strIndex)-'0';
                    strIndex++;
                }
                node.val = val;
                depth = 0;
                node.left = new TreeNode(-1);
                if (!buildTree(dep + 1, node.left)) node.left=null;
                node.right = new TreeNode(-1);
                if (!buildTree(dep + 1, node.right))node.right=null;
            }else{return false;}
            return true;
        }

    }
複雜度計算
  • 時間複雜度:O(n),考慮String的遍歷
  • 空間複雜度:O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章