古典的なアルゴリズムのプレオーダー走査二分木

1.トピックの説明
バイナリツリーを指定すると、そのプレオーダートラバーサルを返します。

例:

入力:[1、NULL、2,3]
。1

2
/
3

出力:[1,2,3]
上級:再帰アルゴリズムは非常に単純です。反復アルゴリズムを完了することができますか?

2.私のコード
/ **

  • バイナリツリーノードの定義。

  • 構造TreeNode {

  • int val;
    
  • TreeNode *left;
    
  • TreeNode *right;
    
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    
  • };
    /
    クラスSolution {
    public:
    vector preorderTraversal(TreeNode
    root){
    TreeNode * cur_node;
    if(root == NULL)
    return result_vec;

     result_vec.push_back(root->val);
     preorderTraversal(root->left);
     preorderTraversal(root->right);
    
     return result_vec;
    

    }
    vector result_vec;
    };

スタックを使用する
/ **

  • バイナリツリーノードの定義。

  • 構造TreeNode {

  • int val;
    
  • TreeNode *left;
    
  • TreeNode *right;
    
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    
  • };
    /
    クラスSolution {
    public:
    vector preorderTraversal(TreeNode
    root){
    TreeNode * cur_node;
    stack <TreeNode *> stack_node;
    TreeNode * pre_node;

     if(root == NULL)
         return result_vec;
     cur_node = root;
     while(cur_node != NULL || !stack_node.empty()){
         if(cur_node == NULL){
             cur_node = stack_node.top();
             stack_node.pop();
         }
         result_vec.push_back(cur_node->val);
         if(cur_node->right != NULL)
             stack_node.push(cur_node->right);
         cur_node = cur_node->left;
     };
    
     return result_vec;
    

    }
    vector result_vec;
    };
    3.オンラインのより優れたソリューション
    Morrisアルゴリズムロジックは明確ではありませんが、ストレージスペースを節約できる可能性があります
    4.改善できる場所
    a。スタック方式を使用すると、実行効率が高くなく、ロジック設計が間違っています
    b。5.
    理解できないようにコードを最適化する(効率の低下:63%、メモリの低下:100%)
    / **

  • バイナリツリーノードの定義。

  • 構造TreeNode {

  • int val;
    
  • TreeNode *left;
    
  • TreeNode *right;
    
  • TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    
  • };
    /
    クラスSolution {
    public:
    vector preorderTraversal(TreeNode
    root){
    TreeNode * cur_node;
    stack <TreeNode *> stack_node;
    TreeNode * pre_node;

     if(root == NULL)
         return result_vec;
     cur_node = root;
     stack_node.push(cur_node);
     while(!stack_node.empty()){
         cur_node = stack_node.top();
         stack_node.pop();
         result_vec.push_back(cur_node->val);
         if(cur_node->right != NULL)
             stack_node.push(cur_node->right);
         if(cur_node->left != NULL)
             stack_node.push(cur_node->left);
     };
    
     return result_vec;
    

    }
    vector result_vec;
    };
    6.得られた思考
    トラバーサル順序が異なる場合、スタックに入るロジックは異なります。そうでない場合、ロジックの明確性と実行効率にさえ影響します

オリジナルの記事を4件公開 Likes0 訪問数22

おすすめ

転載: blog.csdn.net/digitaluser/article/details/105617352