91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么將二叉樹展開成鏈表

發布時間:2022-03-28 15:49:45 來源:億速云 閱讀:140 作者:iii 欄目:大數據

這篇文章主要介紹“C++怎么將二叉樹展開成鏈表”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++怎么將二叉樹展開成鏈表”文章能幫助大家解決問題。

將二叉樹展開成鏈表

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

1
/
2   5
/   
3   4   6

The flattened tree should look like:

   1

2

3

4

5

6

click to show hints.

Hints:

If you notice carefully in the flattened tree, each node"s right child points to the next node of a pre-order trave

這道題要求把二叉樹展開成鏈表,根據展開后形成的鏈表的順序分析出是使用先序遍歷,那么只要是數的遍歷就有遞歸和非遞歸的兩種方法來求解,這里我們也用兩種方法來求解。首先來看遞歸版本的,思路是先利用 DFS 的思路找到最左子節點,然后回到其父節點,把其父節點和右子節點斷開,將原左子結點連上父節點的右子節點上,然后再把原右子節點連到新右子節點的右子節點上,然后再回到上一父節點做相同操作。代碼如下:

解法一:

class Solution {
public:
    void flatten(TreeNode *root) {
        if (!root) return;
        if (root->left) flatten(root->left);
        if (root->right) flatten(root->right);
        TreeNode *tmp = root->right;
        root->right = root->left;
        root->left = NULL;
        while (root->right) root = root->right;
        root->right = tmp;
    }
};

例如,對于下面的二叉樹,上述算法的變換的過程如下:

 1
    / 
   2   5
  /    
 3   4   6

     1
    / 
   2   5
       
     3   6
          
       4

   1
    
     2
      
       3
        
         4
          
           5
            
             6

下面再來看非迭代版本的實現,這個方法是從根節點開始出發,先檢測其左子結點是否存在,如存在則將根節點和其右子節點斷開,將左子結點及其后面所有結構一起連到原右子節點的位置,把原右子節點連到元左子結點最后面的右子節點之后。代碼如下:

解法二:

class Solution {
public:
    void flatten(TreeNode *root) {
        TreeNode *cur = root;
        while (cur) {
            if (cur->left) {
                TreeNode *p = cur->left;
                while (p->right) p = p->right;
                p->right = cur->right;
                cur->right = cur->left;
                cur->left = NULL;
            }
            cur = cur->right;
        }
    }
};

例如,對于下面的二叉樹,上述算法的變換的過程如下:

 1
    / 
   2   5
  /    
 3   4   6

   1
    
     2
    / 
   3   4
        
         5
          
           6
           
   1
    
     2
      
       3
        
         4
          
           5
            
             6

前序迭代解法如下:

解法三:

class Solution {
public:
    void flatten(TreeNode* root) {
        if (!root) return;
        stack<TreeNode*> s;
        s.push(root);
        while (!s.empty()) {
            TreeNode *t = s.top(); s.pop();
            if (t->left) {
                TreeNode *r = t->left;
                while (r->right) r = r->right;
                r->right = t->right;
                t->right = t->left;
                t->left = NULL;
            }
            if (t->right) s.push(t->right);
        }
    }
};

關于“C++怎么將二叉樹展開成鏈表”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

沁源县| SHOW| 定结县| 县级市| 扬中市| 哈密市| 苗栗县| 开江县| 咸丰县| 胶州市| 新乐市| 周口市| 乌鲁木齐县| 介休市| 禄丰县| 广丰县| 安多县| 阿城市| 临高县| 平塘县| 富平县| 绥江县| 托里县| 莫力| 麻阳| 礼泉县| 东方市| 肇庆市| 即墨市| 牡丹江市| 宁德市| 太湖县| 开原市| 葫芦岛市| 大名县| 镇巴县| 泰州市| 阿图什市| 方城县| 黔江区| 通化县|