アルゴリズムの問題-ツリーを双方向チェーンテーブルに変換


何海濤ブログ:ツリーがソートされる双方向チェーンテーブル
 
考え方:再帰.
  • ルートが空の場合、直接戻ります.
  • 左サブツリーを先に変換し、変換に成功すると、左サブツリーを変換したチェーンテーブルの最後のノードとルートが接続される.
  • 右サブツリーを再変換し、変換後のチェーンテーブルの最初のノードとルートを接続します.
  • は、最後にチェーンヘッダ/テールノードに戻る. 

  •  
     1 struct TreeNode
    
     2 {
    
     3     int val;
    
     4     TreeNode *left, *right;
    
     5 };
    
     6 
    
     7 TreeNode *BTree2List(TreeNode *root, bool asRight)
    
     8 {
    
     9     if(root == NULL)
    
    10         return NULL;
    
    11 
    
    12     TreeNode *pLeft  = NULL;
    
    13     TreeNode *pRight = NULL;
    
    14 
    
    15     //  
    
    16     if(root->left != NULL)
    
    17         pLeft = BTree2List(root->left, false);
    
    18 
    
    19     //
    
    20     if(pLeft != NULL)
    
    21     {
    
    22         pLeft->right = root;
    
    23         root->left   = pLeft;
    
    24     }
    
    25 
    
    26     //  
    
    27     if(root->right != NULL)
    
    28         pRight = BTree2List(root->right, true);
    
    29 
    
    30     //
    
    31     if(pRight != NULL)
    
    32     {
    
    33         pRight->left = root;
    
    34         root->right  = pRight;
    
    35     }
    
    36 
    
    37     //  , ; 
    
    38     TreeNode *pRet = root;
    
    39 
    
    40     if(asRight)
    
    41     {
    
    42         while(pRet->left != NULL)
    
    43             pRet = pRet->left;
    
    44     }
    
    45     else
    
    46     {
    
    47         while(pRet->right != NULL)
    
    48             pRet = pRet->right;
    
    49     }
    
    50 
    
    51     return pRet;
    
    52 }
    
    53 
    
    54 TreeNode *TreeToList(TreeNode *root)
    
    55 {
    
    56     return BTree2List(root, true);
    
    57 }