二分木ジグザグレベルの順序トラバーサルに対するこのアルゴリズムの時間計算量はどのくらいですか?

趙南

二分木ジグザグレベルの順序トラバーサル
二分木が与えられた場合、そのノードの値のジグザグレベルの順序トラバーサルを返します。(つまり、左から右へ、次に右から左へと次のレベルへ、そして交互に)。

例:与えられた二分木{3,9,20、#、#、15,7}、

        3 
       / \ 
      9   20 
     / \ 
   15   7 

ジグザグレベルの順序トラバーサルを次のように返します。

[   
    [3],
    [20,9],
    [15,7]
]


個人的には
時間計算量 = O(n *高さ)、nはノードの数、高さは与えられた二分木の高さだと思います

   getHeight()             => O(n) 
   traverseSpecificLevel() => O(n)
   reverseVector()         => O(n)
   swap()                  => O(1)


C ++

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
#include <vector>
using namespace std;

class Solution {
public:
    vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
        vector<vector<int>> list;

        // Input validation.
        if (root == NULL) return list;

        // Get the height of the binary tree.
        int height = getHeight(root);

        bool left_to_right = true;
        for (int level = 0; level <= height; level ++) {
            vector<int> subList;
            traverseSpecificLevel(root, level, subList);

            if (left_to_right == true) {
                // Add subList into list.
                list.push_back(subList);
                // Update left_to_right flag.
                left_to_right = false;

            } else {
                // Reverse subList.
                reverseVector(subList);
                // Add reversed subList into list.
                list.push_back(subList);
                // Update left_to_right flag.
                left_to_right = true;
            }
        }
        return list;
    }

    int getHeight(TreeNode *root) {
        // Base case.
        if (root == NULL || (root->left == NULL && root->right == NULL)) return 0;
        else return 1 + max(getHeight(root->left), getHeight(root->right));
    }

    void traverseSpecificLevel(TreeNode *root, int level, vector<int> &subList) {
        // Base case.
        if (root == NULL) return;
        if (level == 0) {
            subList.push_back(root->val);
            return;
        }

        // Do recursion.
        traverseSpecificLevel(root->left, level - 1, subList);
        traverseSpecificLevel(root->right, level - 1, subList);
    }

    void reverseVector(vector<int> &list) {
        // Input validation.
        if (list.size() <= 1) return;

        int start = 0;
        int end = list.size() - 1;
        while (start < end) {
            swap(list, start, end);

            start ++;
            end --;
        }
    }

    void swap(vector<int> &list, int first, int second) {
        int tmp = list[first];
        list[first] = list[second];
        list[second] = tmp;
    }
};
イヴァン・スミルノフ

あなたは線形時間でそれを行うことができます。サイズがmax_heightのベクトル>結果を作成します。ノードのレベルを維持しながら、ツリーを再帰的にトラバースします。すべてのノードについて、その値をresult [level]にプッシュバックします。結果[1]、結果[3]、...を逆にするだけではありません。

ちなみに、swap(x,y)関数とreverse(a.begin(), a.end())関数(ここaで、はベクトル)があり、自分で実装する代わりにそれらを使用することができます。それを含めますalgorithm

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ニュートン法と二分法のアルゴリズムの時間計算量はどれくらいですか?

分類Dev

ワイルドカードマッチングのためのこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

このアルゴリズム(擬似コード)の時間計算量はどれくらいですか?

分類Dev

順序および事前順序トラバーサルからの二分木の構築の時間計算量

分類Dev

このアルゴリズムの時間計算量はどのくらいですか?

分類Dev

このBFSアルゴリズムの時間計算量はどれくらいですか?

分類Dev

このコイン交換アルゴリズムの時間計算量はどれくらいですか?

分類Dev

このアルゴリズム(Big-O)の時間計算量はどれくらいですか?

分類Dev

このアルゴリズムの時間計算量はどれくらいですか?

分類Dev

この生成アルゴリズムの時間計算量はどれくらいですか?

分類Dev

このJSアルゴリズムの時間計算量はどれくらいですか

分類Dev

最大二者間マッチングアルゴリズムの時間計算量はどれくらいですか?

分類Dev

AVLツリーとバイナリツリーを使用したこのアルゴリズムの時間計算量はどれくらいですか

分類Dev

すべてのことばの梯子を取得するためのこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

すべてのパス合計を見つけるためのこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

次の再帰的アルゴリズムの時間計算量はどのくらいですか?

分類Dev

すべての組み合わせを見つけるためのこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

数独のアルゴリズムXの時間計算量はどれくらいですか?

分類Dev

以下のアルゴリズムの時間計算量はどれくらいですか?

分類Dev

二分探索アルゴリズムの時間計算量は?

分類Dev

二分探索木の順序トラバーサルのためのループレス関数アルゴリズム

分類Dev

与えられたアルゴリズムの時間計算量はどれくらいですか?

分類Dev

二分木レベルの順序トラバーサル時間の複雑さ

分類Dev

最長の回文部分文字列を見つけるこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

私の二分探索木cプログラムに問題があります。順序トラバーサルを使用しています。ルートノードのみが出力されるのはなぜですか?

分類Dev

この二分探索木アルゴリズムで再帰がどのように機能するか

分類Dev

このアルゴリズムの時間計算量を計算するにはどうすればよいですか?

分類Dev

二分木の代替レベルの順序トラバーサル

分類Dev

このアルゴリズムの時間計算量はΘ(n)ですか?

Related 関連記事

  1. 1

    ニュートン法と二分法のアルゴリズムの時間計算量はどれくらいですか?

  2. 2

    ワイルドカードマッチングのためのこのアルゴリズムの時間計算量はどれくらいですか?

  3. 3

    このアルゴリズム(擬似コード)の時間計算量はどれくらいですか?

  4. 4

    順序および事前順序トラバーサルからの二分木の構築の時間計算量

  5. 5

    このアルゴリズムの時間計算量はどのくらいですか?

  6. 6

    このBFSアルゴリズムの時間計算量はどれくらいですか?

  7. 7

    このコイン交換アルゴリズムの時間計算量はどれくらいですか?

  8. 8

    このアルゴリズム(Big-O)の時間計算量はどれくらいですか?

  9. 9

    このアルゴリズムの時間計算量はどれくらいですか?

  10. 10

    この生成アルゴリズムの時間計算量はどれくらいですか?

  11. 11

    このJSアルゴリズムの時間計算量はどれくらいですか

  12. 12

    最大二者間マッチングアルゴリズムの時間計算量はどれくらいですか?

  13. 13

    AVLツリーとバイナリツリーを使用したこのアルゴリズムの時間計算量はどれくらいですか

  14. 14

    すべてのことばの梯子を取得するためのこのアルゴリズムの時間計算量はどれくらいですか?

  15. 15

    すべてのパス合計を見つけるためのこのアルゴリズムの時間計算量はどれくらいですか?

  16. 16

    次の再帰的アルゴリズムの時間計算量はどのくらいですか?

  17. 17

    すべての組み合わせを見つけるためのこのアルゴリズムの時間計算量はどれくらいですか?

  18. 18

    数独のアルゴリズムXの時間計算量はどれくらいですか?

  19. 19

    以下のアルゴリズムの時間計算量はどれくらいですか?

  20. 20

    二分探索アルゴリズムの時間計算量は?

  21. 21

    二分探索木の順序トラバーサルのためのループレス関数アルゴリズム

  22. 22

    与えられたアルゴリズムの時間計算量はどれくらいですか?

  23. 23

    二分木レベルの順序トラバーサル時間の複雑さ

  24. 24

    最長の回文部分文字列を見つけるこのアルゴリズムの時間計算量はどれくらいですか?

  25. 25

    私の二分探索木cプログラムに問題があります。順序トラバーサルを使用しています。ルートノードのみが出力されるのはなぜですか?

  26. 26

    この二分探索木アルゴリズムで再帰がどのように機能するか

  27. 27

    このアルゴリズムの時間計算量を計算するにはどうすればよいですか?

  28. 28

    二分木の代替レベルの順序トラバーサル

  29. 29

    このアルゴリズムの時間計算量はΘ(n)ですか?

ホットタグ

アーカイブ