Leetcode:NO.1028 從先序遍歷還原二叉樹 前序遍歷

題目

我們從二叉樹的根節點 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 之間。

鏈接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal

解題記錄

  • 通過保留上層節點的方式逐層構建
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode recoverFromPreorder(String S) {
        Map<Integer, TreeNode> map = new HashMap<>();
        char[] seq = S.toCharArray();
        int count = 0;
        int num = 0;
        for (int i=0 ; i< seq.length; ++i) {
            char c = seq[i];
            if ( seq[i] == '-') {
                count ++;
            }else{
                num = num*10 + ( c-'0');
                if (i == seq.length-1 || seq[i+1] == '-'){
                    TreeNode node = new TreeNode(num);
                    map.put(count, node);
                    if (map.containsKey(count-1)){
                        TreeNode preNode = map.get(count-1);
                        if (preNode.left != null) preNode.right = node;
                        else preNode.left = node;
                    }
                    num = 0;
                    count = 0;
                }
            }
        }
        return map.get(0);
    }
}

在這裏插入圖片描述

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