演算法題 二叉樹的垂序遍歷

2022-06-29 05:00:14 字數 1326 閱讀 7507

給你二叉樹的根結點 root ,請你設計演算法計算二叉樹的 垂序遍歷 序列。

對位於 (row, col) 的每個結點而言,其左右子結點分別位於 (row + 1, col - 1) 和 (row + 1, col + 1) 。樹的根結點位於 (0, 0) 。

二叉樹的 垂序遍歷 從最左邊的列開始直到最右邊的列結束,按列索引每一列上的所有結點,形成乙個按出現位置從上到下排序的有序列表。如果同行同列上有多個結點,則按結點的值從小到大進行排序。

返回二叉樹的 垂序遍歷 序列。

示例 1:

輸入:root = [3,9,20,null,null,15,7]

輸出:[[9],[3,15],[20],[7]]

解釋:列 -1 :只有結點 9 在此列中。

列 0 :只有結點 3 和 15 在此列中,按從上到下順序。

列 1 :只有結點 20 在此列中。

列 2 :只有結點 7 在此列中。

示例 2:

輸入:root = [1,2,3,4,5,6,7]

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

解釋:列 -2 :只有結點 4 在此列中。

列 -1 :只有結點 2 在此列中。

列 0 :結點 1 、5 和 6 都在此列中。

1 在上面,所以它出現在前面。

5 和 6 位置都是 (2, 0) ,所以按值從小到大排序,5 在 6 的前面。

列 1 :只有結點 3 在此列中。

列 2 :只有結點 7 在此列中。

示例 3:

先遍歷樹找出輸出陣列的長度,再次遍歷樹並儲存每個節點的深度和值,將節點插入對應橫座標的列表,最後再排序

class solution );

}vector> ans;

for (auto & list : res)

ans.push_back(temp);

}return ans;

}void dfs(treenode* root, vector>>& res, int i, int depth) );

}if (root->left)

dfs(root->left, res, i - 1, depth+1);

if (root->right)

dfs(root->right, res, i + 1, depth+1);

}void getrange(treenode* root, int index)

};

複雜度

n 表示節點個數

時間複雜度:o(n)

空間複雜度:o(n)

987 二叉樹的垂序遍歷

給定二叉樹,按垂序遍歷返回其結點值。對位於 x,y 的每個結點而言,其左右子結點分別位於 x 1,y 1 和 x 1,y 1 把一條垂線從x infinity移動到x infinity,每當該垂線與結點接觸時,我們按從上到下的順序報告結點的值 y座標遞減 如果兩個結點位置相同,則首先報告的結點值較小...

987 二叉樹的垂序遍歷

給定二叉樹,按垂序遍歷返回其結點值。對位於 x,y 的每個結點而言,其左右子結點分別位於 x 1,y 1 和 x 1,y 1 把一條垂線從 x infinity 移動到 x infinity 每當該垂線與結點接觸時,我們按從上到下的順序報告結點的值 y 座標遞減 如果兩個結點位置相同,則首先報告的結...

演算法題 二叉樹的中序遍歷

題目描述 給定乙個二叉樹,返回它的中序 遍歷。示例 輸入 1,null,2,3 1 2 3輸出 1,3,2 高階 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?解法一通過遞迴實現。時間複雜度 o n 空間複雜度 平均是o logn 樹的高度 最壞是o n 當樹退化成煉表時 definition fo...