真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++怎么將二叉樹(shù)展開(kāi)成鏈表

這篇文章主要介紹“C++怎么將二叉樹(shù)展開(kāi)成鏈表”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“C++怎么將二叉樹(shù)展開(kāi)成鏈表”文章能幫助大家解決問(wèn)題。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了潁州免費(fèi)建站歡迎大家使用!

將二叉樹(shù)展開(kāi)成鏈表

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

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

解法一:

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;
    }
};

例如,對(duì)于下面的二叉樹(shù),上述算法的變換的過(guò)程如下:

 1
    / 
   2   5
  /    
 3   4   6

     1
    / 
   2   5
       
     3   6
          
       4

   1
    
     2
      
       3
        
         4
          
           5
            
             6

下面再來(lái)看非迭代版本的實(shí)現(xiàn),這個(gè)方法是從根節(jié)點(diǎn)開(kāi)始出發(fā),先檢測(cè)其左子結(jié)點(diǎn)是否存在,如存在則將根節(jié)點(diǎn)和其右子節(jié)點(diǎn)斷開(kāi),將左子結(jié)點(diǎn)及其后面所有結(jié)構(gòu)一起連到原右子節(jié)點(diǎn)的位置,把原右子節(jié)點(diǎn)連到元左子結(jié)點(diǎn)最后面的右子節(jié)點(diǎn)之后。代碼如下:

解法二:

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;
        }
    }
};

例如,對(duì)于下面的二叉樹(shù),上述算法的變換的過(guò)程如下:

 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 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);
        }
    }
};

關(guān)于“C++怎么將二叉樹(shù)展開(kāi)成鏈表”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。


網(wǎng)頁(yè)題目:C++怎么將二叉樹(shù)展開(kāi)成鏈表
網(wǎng)站網(wǎng)址:http://weahome.cn/article/ijdojs.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部